>t=setmetatable({},{__index=other}) >t.foo 3 >t.bar nil 如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。 __index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。
setmetatable(o,self) self.__index=function(table, key) ifself[key] ==nilthen error("获取值时,不存在此字段: ".. key) else returnself[key] end end self.__newindex=function(table, key, value) ifself[key] ==nilthen error("设置值时,不存在此字段: ".. key) else ifvalue ==nilthen ...
因此Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。 setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。 getmetatable(table): 返回对象的元表(metatable)。 setmetatable和getmetatable mytable = {} ...
大家可以参考lua手册,metatable是被译作元表,Lua 中的每个值都可以用一个 metatable。这个 metatable 就是一个原始的 Lua table ,它用来定义原始值在特定操作下的行为。 一个metatable 可以控制一个对象做数学运算操作、比较操作、连接操作、取长度操作、取下标操作时的行为,metatable 中还可以定义一个函数,让 userda...
Lua是一种轻量级的脚本语言,它支持面向对象编程的一种机制叫做元表(Metatable)。元表可以为表(Table)设置一组特殊的操作,例如重载运算符、定义表的行为等。当我们在一个表中调用一个方法时,Lua会首先在表中查找该方法,如果找不到,则会继续在元表中查找。
setmetatable(t, mt) end 1. 2. 3. 4. 5. 6. 7. 如果默认值没有 weak 的 keys,它就会将所有的带有默认值的 tables 设定为永久存在。在第二种方法中,我们使用不同的 metatables 来保存不同的默认值,但当我们重复使用一个默认值的时候,重用同一个相同的 metatable。这是一个典型的记忆技术的应用: ...
end}--将元表应用到普通表上setmetatable(myTable,metaTable)--现在当我们尝试为myTable中不存在的键赋值时 myTable.x=10--我们会看到输出:Setting x to10--已经存在的键仍然可以直接赋值 myTable.x=20--这里不会触发__newindex因为键已经存在 在这个例子中,当你尝试为设置一个新的键时,元方法会被调用,并...
1.getmetatable函数 getmetatable函数 来获取任何值的元表。 2.setmetatable函数 setmetatable来替换一张表的元表。在 Lua 中,不可以改变表以外其它类型的值的元表那些只能在 C 里做。 二、元方法 在ltm.h的TMS枚举中定义了元方法的枚举类型,在global_state中有一个tmname字段,为TMS到元方法名字的映射,在下面...
-- call_test.lua脚本文件-- 创建一个简单的表localgreet={}-- 定义元表,并添加__call元方法localmt={__call=function(tbl,name)-- 当表被调用时返回问候语return"Hello, "..tostring(name).."!"end}-- 将元表应用到greet表上setmetatable(greet,mt)-- 现在可以像调用函数一样调用greet表print(greet...
元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",否则返回 mytable 对应的键值。 我们可以将以上代码简单写成: mytable=setmetatable({key1="value1"},{__index={key2="metatablevalue"}})print(mytable.key1,mytable.key2) ...