Lua / Luajit:同时建立索引和命名方法?

时间:2018-10-29 17:29:54

标签: lua ffi luajit

Lua PILLuajit FFI tutorial在元表中提供了__index的两种用法。

一个用于像obj [123]这样的索引,例如

__index = function (self, k) return self._data+(k-self._lower)

另一种用法是定义命名方法,如本教程所述

__index = { area = function(a) return a.x*a.x + a.y*a.y end, },

然后我们可以像obj:area()那样进行函数调用。

我可以同时执行两个操作,例如直接索引和命名方法吗?

1 个答案:

答案 0 :(得分:4)

就像Lua中有趣的代码一样,答案是更多的元表。

当您的{0:n2}元方法实际上是一个表时,Lua只需对给定表进行标准表访问。这意味着您可以在元表上设置一个元表。然后,您可以在此“可实现元数据”的方法上设置__index元方法。

__index

有了这个,当您尝试访问两个表中都不存在的字段时,lua将首先尝试访问顶级表,该顶级表将访问第一个元表,然后在第二个元表中调用您的元方法。 >


还有另一个可能更直接的答案:使用您的foo = function() print("foo") end bar = function(_, key) return function() print(string.format("bar: %s", key)) end end mmt = { __index = bar } mti = { foo = foo } mt = { __index = mti } t = {} setmetatable(mti, mmt) setmetatable(t, mt) t.foo() -- prints: "foo" t.bar() -- prints: "bar: bar" t.baz() -- prints: "bar: baz" 元方法检查另一个表中的命名字段:

__index

在Lua 5.3上进行了测试。