📄 lua 5_1 参考手册.htm
字号:
<P>"eq" 事件按如下方式定义: <PRE> function eq_event (op1, op2)
if type(op1) ~= type(op2) then -- 不同的类型?
return false -- 不同的对象
end
if op1 == op2 then -- 原生的相等比较结果?
return true -- 对象相等
end
-- 尝试使用元方法
local h = getcomphandler(op1, op2, "__eq")
if h then
return h(op1, op2)
else
return false
end
end
</PRE>
<P><CODE>a ~= b</CODE> 等价于 <CODE>not (a == b)</CODE> 。 </P>
<LI><B>"lt":</B> <CODE><</CODE> 操作。 <PRE> function lt_event (op1, op2)
if type(op1) == "number" and type(op2) == "number" then
return op1 < op2 -- 数字比较
elseif type(op1) == "string" and type(op2) == "string" then
return op1 < op2 -- 字符串按逐字符比较
else
local h = getcomphandler(op1, op2, "__lt")
if h then
return h(op1, op2)
else
error(···);
end
end
end
</PRE>
<P><CODE>a > b</CODE> 等价于 <CODE>b < a</CODE>. </P>
<LI><B>"le":</B> <CODE><=</CODE> 操作。 <PRE> function le_event (op1, op2)
if type(op1) == "number" and type(op2) == "number" then
return op1 <= op2 -- 数字比较
elseif type(op1) == "string" and type(op2) == "string" then
return op1 <= op2 -- 字符串按逐字符比较
else
local h = getcomphandler(op1, op2, "__le")
if h then
return h(op1, op2)
else
h = getcomphandler(op1, op2, "__lt")
if h then
return not h(op2, op1)
else
error(···);
end
end
end
end
</PRE>
<P><CODE>a >= b</CODE> 等价于 <CODE>b <= a</CODE> 。注意,如果元方法 "le" 没有提供,Lua
就尝试 "lt" ,它假定 <CODE>a <= b</CODE> 等价于 <CODE>not (b < a)</CODE> 。 </P>
<LI><B>"index":</B> 取下标操作用于访问 <CODE>table[key]</CODE> 。 <PRE> function gettable_event (table, key)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then return v end
h = metatable(table).__index
if h == nil then return nil end
else
h = metatable(table).__index
if h == nil then
error(···);
end
end
if type(h) == "function" then
return h(table, key) -- 调用处理器
else return h[key] -- 或是重复上述操作
end
end
</PRE>
<P></P>
<LI><B>"newindex":</B> 赋值给指定下标 <CODE>table[key] = value</CODE> 。 <PRE> function settable_event (table, key, value)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then rawset(table, key, value); return end
h = metatable(table).__newindex
if h == nil then rawset(table, key, value); return end
else
h = metatable(table).__newindex
if h == nil then
error(···);
end
end
if type(h) == "function" then
return h(table, key,value) -- 调用处理器
else h[key] = value -- 或是重复上述操作
end
end
</PRE>
<P></P>
<LI><B>"call":</B> 当 Lua 调用一个值时调用。 <PRE> function function_event (func, ...)
if type(func) == "function" then
return func(...) -- 原生的调用
else
local h = metatable(func).__call
if h then
return h(func, ...)
else
error(···)
end
end
end
</PRE>
<P></P></LI></UL>
<H2>2.9 - <A name=2.9>环境</A></H2>
<P>类型为 thread ,function ,以及 userdata 的对象,除了 metatable
外还可以用另外一个与之关联的被称作它们的环境的一个表,像 metatable 一样,环境也是一个常规的 table ,多个对象可以共享同一个环境。
<P>userdata 的环境在 Lua 中没有意义。这个东西只是为了在程序员想把一个表关联到一个 userdata 上时提供便利。
<P>关联在线程上的环境被称作全局环境。全局环境被用作它其中的线程以及线程创建的非嵌套函数(通过 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#pdf-loadfile"><CODE>loadfile</CODE></A>
, <A
href="http://www.codingnow.com/2000/download/lua_manual.html#pdf-loadstring"><CODE>loadstring</CODE></A>
或是 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#pdf-load"><CODE>load</CODE></A>
)的缺省环境。而且它可以被 C 代码直接访问(参见 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#3.3">§3.3</A>)。
<P>关联在 C 函数上的环境可以直接被 C 代码访问(参见 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#3.3">§3.3</A>)。它们会作为这个
C 函数中创建的其它函数的缺省环境。
<P>关联在 Lua 函数上的环境用来接管在函数内对全局变量(参见 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#2.3">§2.3</A>)的所有访问。它们也会作为这个函数内创建的其它函数的缺省环境。
<P>你可以通过调用 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#pdf-setfenv"><CODE>setfenv</CODE></A>
来改变一个 Lua 函数或是正在运行中的线程的环境。而想操控其它对象(userdata、C 函数、其它线程)的环境的话,就必须使用 C API 。
<H2>2.10 - <A name=2.10>垃圾收集</A></H2>
<P>Lua 提供了一个自动的内存管理。这就是说你不需要关心创建新对象的分配内存操作,也不需要在这些对象不再需要时的主动释放内存。 Lua
通过运行一个垃圾收集器来自动管理内存,以此一遍又一遍的回收死掉的对象(这是指 Lua 中不再访问的到的对象)占用的内存。 Lua 中所有对象都被自动管理,包括:
table, userdata、 函数、线程、和字符串。
<P>Lua 实现了一个增量标记清除的收集器。它用两个数字来控制垃圾收集周期: <EM>garbage-collector pause</EM> 和
<EM>garbage-collector step multiplier</EM> 。
<P>garbage-collector pause 控制了收集器在开始一个新的收集周期之前要等待多久。随着数字的增大就导致收集器工作工作的不那么主动。小于 1
的值意味着收集器在新的周期开始时不再等待。当值为 2 的时候意味着在总使用内存数量达到原来的两倍时再开启新的周期。
<P>step multiplier 控制了收集器相对内存分配的速度。更大的数字将导致收集器工作的更主动的同时,也使每步收集的尺寸增加。小于 1
的值会使收集器工作的非常慢,可能导致收集器永远都结束不了当前周期。缺省值为 2 ,这意味着收集器将以内存分配器的两倍速运行。
<P>你可以通过在 C 中调用 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#lua_gc"><CODE>lua_gc</CODE></A>
或是在 Lua 中调用 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#pdf-collectgarbage"><CODE>collectgarbage</CODE></A>
来改变这些数字。两者都接受百分比数值(因此传入参数 100 意味着实际值 1 )。通过这些函数,你也可以直接控制收集器(例如,停止或是重启)。
<H3>2.10.1 - <A name=2.10.1>垃圾收集的元方法</A></H3>
<P>使用 C API ,你可以给 userdata (参见 <A
href="http://www.codingnow.com/2000/download/lua_manual.html#2.8">§2.8</A>)设置一个垃圾收集的元方法。这个元方法也被称为结束子。结束子允许你用额外的资源管理器和
Lua 的内存管理器协同工作(比如关闭文件、网络连接、或是数据库连接,也可以说释放你自己的内存)。
<P>一个 userdata 可被回收,若它的 metatable 中有 <CODE>__gc</CODE>
这个域 ,垃圾收集器就不立即收回它。取而代之的是,Lua 把它们放到一个列表中。最收集结束后,Lua 针对列表中的每个 userdata
执行了下面这个函数的等价操作: <PRE> function gc_event (udata)
local h = metatable(udata).__gc
if h then
h(udata)
end
end
</PRE>
<P>在每个垃圾收集周期的结尾,每个在当前周期被收集起来的 userdata
的结束子会以它们构造时的逆序依次调用。也就是说,收集列表中,最后一个在程序中被创建的 userdata 的结束子会被第一个调用。
<H3>2.10.2 - <A name=2.10.2>Weak Table(弱表)</A></H3>
<P><EM>weak table</EM> 是一个这样的
table,它其中的元素都被弱引用。弱引用将被垃圾收集器忽略掉,换句话说,如果对一个对象的引用只有弱引用,垃圾收集器将回收这个对象。
<P>weak table 的键和值都可以是 weak 的。如果一个 table 只有键是 weak
的,那么将运行收集器回收它们的键,但是会阻止回收器回收对应的值。而一个 table 的键和值都是 weak
时,就即允许收集器回收键又允许收回值。任何情况下,如果键和值中任一个被回收了,整个键值对就会从 table 中拿掉。 table 的 weak
特性可以通过在它的 metatable 中设置 <CODE>__mode</CODE> 域来改变。如果 <CODE>__mode</CODE>
域中是一个包含有字符 '<CODE>k</CODE>' 的字符串时, table 的键就是 weak 的。如果 <CODE>__mode</CODE>
域中是一个包含有字符 '<CODE>v</CODE>' 的字符串时, table 的值就是 weak 的。
<P>在你把一个 table 当作一个 metatable 使用之后,就不能再修改 <CODE>__mode</CODE> 域的值。否则,受这个
metatable 控制的 table 的 weak 行为就成了未定义的。
<H2>2.11 - <A name=2.11>Coroutine (协同例程)</A></H2>
<P>Lua 支持 coroutine ,这个东西也被称为协同式多线程 (<EM>collaborative multithreading</EM>) 。
Lua 为每个 corouti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -