元表是如何工作的,它们用于什么?

我有一个问题,关于 Lua 元表。我听说并查找了相关资料,但我不理解如何使用它们以及用途是什么。

原文链接 https://stackoverflow.com/questions/4250556

点赞
stackoverflow用户516732
stackoverflow用户516732

metatables 是在特定条件下调用的函数。

以 metatable 索引“__newindex”(两个下划线)为例,当你分配一个函数给它时,每当你将一个新的索引添加到一个表中时,该函数都将被调用,例如:

table['wut'] = 'lol';

这是一个使用“__newindex”的自定义metatable示例。

ATable = {}
setmetatable(ATable, {__newindex = function(t,k,v)
    print("Attention! Index \"" .. k .. "\" now contains the value \'" .. v .. "\' in " .. tostring(t));
end});

ATable["Hey"]="Dog";

输出:

Attention! Index "Hey" now contains the value 'Dog' in table: 0022B000

metatable 还可以用于描述表如何与其他表和不同的值交互。

这是您可以使用的所有可能的 metatable 索引列表

* __index(object, key) -- 索引访问 "table[key]"。
* __newindex(object, key, value) -- 索引赋值 "table[key] = value"。
* __call(object, arg) -- 当 Lua 调用对象时调用。arg 是传递的参数。
* __len(object) -- # 操作符的长度。
* __concat(object1, object2) -- 连接运算符 ..。
* __eq(object1, object2) -- 等于运算符 ==。
* __lt(object1, object2) -- 小于运算符 <。
* __le(object1, object2) -- 小于或等于运算符 <=。
* __unm(object) -- 一元运算符 -。
* __add(object1, object2) -- 加法运算符 +。
* __sub(object1, object2) -- 减法运算符 -。类似 __add。
* __mul(object1, object2) -- 乘法运算符 *。类似 __add。
* __div(object1, object2) -- 除法运算符 /。类似 __add。
* __mod(object1, object2) -- 模数运算符 %。类似 __add。
* __tostring(object) -- 不是正确的元方法。将返回您想要的任何内容。
* __metatable -- 如果存在,锁定 metatable,使 getmetatable 返回此 metatable 而不是 metatable,并使 setmetatable 错误。

我希望这能解决问题,如果需要更多示例,请单击此处

2010-11-22 22:27:46
stackoverflow用户510333
stackoverflow用户510333

它们允许将表格视为其他类型,例如字符串、函数、数字等。

2010-11-24 21:57:16
stackoverflow用户468527
stackoverflow用户468527

如果想要了解原型模式的高层次、娱乐性阅读内容,请查看http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html。这可以帮助你了解“什么”。

2010-11-25 21:43:47