匿名
未登录
讨论
暗色模式
贡献
创建账号
登录
滚动的天空Wiki
搜索
编辑“
Help:Lua
”(章节)
来自滚动的天空Wiki
命名空间
帮助
讨论
更多
更多
语言
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
页面操作
阅读
编辑源代码
历史
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
== 元表 == 每个表都可以设置一个'''元表(metatable)''',用来修改特定的行为。{{code|setmetatable(t, m)|lang=lua}}可以用来将表t的元表设为m(m也可以为nil,表示取消元表设置)<ref name="setmetatable">原版Lua中,debug.setmetatable函数可以强制设置一个值(不限于表)的元表,且不受__metatable元方法影响。MediaWiki删除了此函数。</ref>,该函数自身也会返回修改后的表;{{code|getmetatable(t)|lang=lua}}可以用来获取表t的元表。 如果元表具有'''__index字段''',则当通过指定的键访问表的字段的时候,如果该字段不存在,则会使用元表__index字段。如果__index是表,则会访问这个表的字段。如果__index是函数,则会调用这个函数。例如,访问{{code|t[k]|lang=lua}}时,如果表本身的这个字段不存在,则会尝试访问{{code|__index[k]|lang=lua}}(如果__index是表)或{{code|__index(t, k)|lang=lua}}(如果__index是函数)。rawget函数可绕过这个元方法。 '''__newindex字段'''则用于修改给表的字段赋值的行为。赋值给表的一个不存在的键时,如果__newindex字段的值是表,则会在该表中重复赋值。如果__newindex的值是函数,则会调用这个函数。例如,执行{{code|code=t[k] = v|lang=lua}}时,表本身不存在这个字段,则会执行{{code|code=__newindex[k] = v|lang=lua}}(如果__newindex是表)或{{code|code=__newindex(t, k, v)|lang=lua}}(如果__newindex是函数)。rawset函数可绕过这个元方法。 '''__call字段'''可以让表能像函数那样调用,值必须是函数。如果这个元表字段存在,则调用表{{code|t(...)|lang=lua}}时,会像{{code|__call(t, ...)|lang=lua}}这样调用,而不是抛出无法调用表的错误。 '''__metatable字段'''用于保护元表,防止其被访问或修改。如果该字段存在,当对表进行getmetatable时,不会返回真正的元表,而是返回该字段的值<ref name="getmetatable">原版Lua的debug.getmetatable函数可以强制获取任意值的元表,不受__metatable元方法影响。MediaWiki删除了此函数。</ref>,如果进行setmetatable,则会抛出错误<ref name="setmetatable" />。 '''__mode字段'''用于使表保持弱引用。在Lua中,变量和表的字段对对象(函数、表等)的引用是强引用,只要某个函数和表依然存在引用,例如存储在某个全局变量或者没有超出作用域的局部变量中,或作为键或者值存储在未被清理掉的表中,那么它就不会被垃圾收集机制清理掉,而是一直存储在内存中。弱引用则表示其引用不会阻止该表中存储的内容被清理。当<code>__mode</code>的值为<code>k</code>表示键保持弱引用,<code>v</code>表示值为弱引用,<code>kv</code>表示键和值均为弱引用。例如: <syntaxhighlight lang=lua> t = setmetatable({value = {1, 2, 3}}, {__mode = 'v'}) print(t.value) collectgarbage() print(t.value) </syntaxhighlight> 输出的结果为: <pre> table nil </pre> 元表的一些其他字段用法如下,其值一般都是函数,函数的第一个参数是表自身。例如,如果元表<code>__add</code>字段存在,则对表t计算t + a时,则会调用{{code|__add(t, a)|lang=lua}},而不是抛出无法对表进行算术运算的错误。 {| class=wikitable style="margin:auto" ! 字段名称和用法 !! 对应操作 |- | __add(self, v) || self + v |- | __sub(self, v) || self - v |- | __mul(self, v) || self * v |- | __div(self, v) || self / v |- | __mod(self, v) || self % v |- | __pow(self, v) || self ^ v |- | __unm(self) || -self |- | __concat(self, v) || self .. v |- | __len(self) || #self |- | __eq(self, v) || self == v |- | __lt(self, v) || self < v |- | __le(self, v) || self <= v |- | __pairs(self)<ref name="pairs">原版Lua 5.1没有__pairs和__ipairs的功能(是在后面的版本才加入的),不过Scribunto扩展在Lua中移植了该功能,因此你可以在MediaWiki中使用此元表。</ref> || pairs(self) |- | __ipairs(self)<ref name="pairs" /> || ipairs(self) |- | __tostring(self) || tostring(self) |} 所有字符串共用同一个元表,该元表的__index字段等同于[[Help:Lua/string|string库]]的一个副本,以使得字符串能够作为对象使用。比如,{{code|string.match("label123", "^label%d")|lang=lua}}等价于{{code|("label123"):match("^label%d")|lang=lua}}。注意这个元表无法通过[[Help:Lua/基本#getmetatable|getmetatable]]函数获得<ref>原版Lua可以获取任意值的元表,只要元表存在。</ref>。
摘要:
请注意您对滚动的天空Wiki的所有贡献都被认为是在Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)下发布,请查看在
Project:版权
的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)
Cookie帮助我们提供我们的服务。通过使用我们的服务,您同意我们使用cookie。
更多信息
确定
导航
导航
首页
最近更改
随机页面
所有页面
帮助
格式
互助客栈
Wiki条例
管理员告示板
工具
导入页面
展开模板
创建或编辑任意页面
参数设置
Wiki工具
Wiki工具
特殊页面
页面值
获取缩短的URL
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志
其他项目
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體