⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lua 5_1 参考手册.htm

📁 Lua 是一个扩展式程序设计语言
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  <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>&lt;</CODE> 操作。 <PRE>     function lt_event (op1, op2)
       if type(op1) == "number" and type(op2) == "number" then
         return op1 &lt; op2   -- 数字比较
       elseif type(op1) == "string" and type(op2) == "string" then
         return op1 &lt; op2   -- 字符串按逐字符比较
       else
         local h = getcomphandler(op1, op2, "__lt")
         if h then
           return h(op1, op2)
         else
           error(···);
         end
       end
     end
</PRE>
  <P><CODE>a &gt; b</CODE> 等价于 <CODE>b &lt; a</CODE>. </P>
  <LI><B>"le":</B> <CODE>&lt;=</CODE> 操作。 <PRE>     function le_event (op1, op2)
       if type(op1) == "number" and type(op2) == "number" then
         return op1 &lt;= op2   -- 数字比较
       elseif type(op1) == "string" and type(op2) == "string" then
         return op1 &lt;= 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 &gt;= b</CODE> 等价于 <CODE>b &lt;= a</CODE> 。注意,如果元方法 "le" 没有提供,Lua 
  就尝试 "lt" ,它假定 <CODE>a &lt;= b</CODE> 等价于 <CODE>not (b &lt; 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 + -