元表是如何工作的,它们的用途是啥?

Posted

技术标签:

【中文标题】元表是如何工作的,它们的用途是啥?【英文标题】:How do metatables work and what are they used for?元表是如何工作的,它们的用途是什么? 【发布时间】:2011-05-14 03:04:03 【问题描述】:

我有一个关于 Lua 元表的问题。我听说过并查过它们,但我不明白如何使用它们以及用于什么目的。

【问题讨论】:

【参考方案1】:

元表是在特定条件下调用的函数。 以元表索引“__newindex”(两个下划线)为例,当您为其分配一个函数时,该函数将在您向表中添加新索引时调用,例如;

table['wut'] = 'lol';

这是使用“__newindex”的自定义元表的示例。

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

ATable["Hey"]="Dog";

输出:

注意!索引“嘿”现在包含表中的值“狗”:0022B000

元表也可用于描述表格应如何与其他表格以及不同的值交互。

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

* __index(object, key) -- Index access "table[key]".
* __newindex(object, key, value) -- Index assignment "table[key] = value".
* __call(object, arg) -- called when Lua calls the object. arg is the argument passed.
* __len(object) -- The # length of operator.
* __concat(object1, object2) -- The .. concatination operator.
* __eq(object1, object2) -- The == equal to operator.
* __lt(object1, object2) -- The < less than operator.
* __le(object1, object2) -- The <= less than or equal to operator.
* __unm(object) -- The unary - operator.
* __add(object1, object2) -- The + addition operator.
* __sub(object1, object2) -- The - subtraction operator. Acts similar to __add.
* __mul(object1, object2) -- The * mulitplication operator. Acts similar to __add.
* __div(object1, object2) -- The / division operator. Acts similar to __add.
* __mod(object1, object2) -- The % modulus operator. Acts similar to __add.
* __tostring(object) -- Not a proper metamethod. Will return whatever you want it to return.
* __metatable -- if present, locks the metatable so getmetatable will return this instead of the metatable and setmetatable will error. 

我希望这可以解决问题,如果您需要更多示例,click here。

【讨论】:

谢谢。 =D 而且你还可以使用 metatable 让你的脚本看起来更高级? 是的,我猜。虽然我对完成更复杂任务的东西更感兴趣。 请注意,您的示例是针对用户的。除非您在 __newindex 元方法中的某处执行 t[k] = v,否则值不会进入表中。 “元表是在特定条件下调用的函数”,我认为这不对。元表是,可以有一个或多个键,这些键指向在特定条件下调用的函数。元方法name应该是key,metamethod本身就是key指向的函数。【参考方案2】:

阅读http://www.lua.org/pil/13.html

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

有关原型模式的高层次、有趣的阅读,请查看http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html。这可能会帮助您解决“什么”问题。

【讨论】:

以上是关于元表是如何工作的,它们的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

软件开发中的原表是啥呢?

Android - getTargetFragment 和 setTargetFragment - 它们的用途是啥

函子我啥时候应该使用它们它们的预期用途是啥[关闭]

权利的用途是啥以及如何创建权利?

DROP、TRUNCATE 和 DELETE 之间的区别和最佳用途是啥?它们可以回滚吗? [复制]

eclipse.ini 中参数 XXMaxPermSize、vmargs、Xms 和 Xms 的用途,它们的作用是啥