LuaLuajit如何同时高效构建索引和实现命名方法?

2026-04-01 20:471阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计408个文字,预计阅读时间需要2分钟。

Lua/Luajit如何同时高效构建索引和实现命名方法?

Lua PIL 和 Luajit FFI 教程中,metatable 中定义 __index 的两种用法:

1.用于索引类似 obj[123],如 __index=function(self, k) return self._data(k - self._lower) end

2.用于定义命名方法,如教程中给出的 _方法

Lua PIL和 Luajit FFI tutorial在metatable中给出了__index的两个用法.

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

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

Lua/Luajit如何同时高效构建索引和实现命名方法?

另一种用法是定义命名方法,如教程中所给出的,

__index = {area = function(a)返回a.x * a.x a.y * a.y end,},

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

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

答案,就像Lua中常用的有趣代码一样,是更易于理解的代码.

当你的__index元方法实际上是一个表时,Lua只是在给定的表上进行标准表访问.这意味着您可以在metatable上设置元表.然后你可以在这个“meta-metatable”上设置一个__index元方法.

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"

有了这个,当你尝试访问两个表中都不存在的字段时,lua将首先尝试访问顶级表,该表将访问第一个metatable,然后将在第二个metatable中调用metamethod.

还有另一个可能更直接的答案:使用__index元方法检查另一个表中的命名字段:

foo = function() print("foo") end f = { foo = foo } bar = function(_, key) if f[key] then return f[key] end return function() print(string.format("bar: %s", key)) end end mt = { __index = bar } t = {} setmetatable(t, mt) t.foo() -- prints: "foo" t.bar() -- prints: "bar: bar" t.baz() -- prints: "bar: baz"

在Lua 5.3上测试过.

本文共计408个文字,预计阅读时间需要2分钟。

Lua/Luajit如何同时高效构建索引和实现命名方法?

Lua PIL 和 Luajit FFI 教程中,metatable 中定义 __index 的两种用法:

1.用于索引类似 obj[123],如 __index=function(self, k) return self._data(k - self._lower) end

2.用于定义命名方法,如教程中给出的 _方法

Lua PIL和 Luajit FFI tutorial在metatable中给出了__index的两个用法.

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

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

Lua/Luajit如何同时高效构建索引和实现命名方法?

另一种用法是定义命名方法,如教程中所给出的,

__index = {area = function(a)返回a.x * a.x a.y * a.y end,},

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

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

答案,就像Lua中常用的有趣代码一样,是更易于理解的代码.

当你的__index元方法实际上是一个表时,Lua只是在给定的表上进行标准表访问.这意味着您可以在metatable上设置元表.然后你可以在这个“meta-metatable”上设置一个__index元方法.

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"

有了这个,当你尝试访问两个表中都不存在的字段时,lua将首先尝试访问顶级表,该表将访问第一个metatable,然后将在第二个metatable中调用metamethod.

还有另一个可能更直接的答案:使用__index元方法检查另一个表中的命名字段:

foo = function() print("foo") end f = { foo = foo } bar = function(_, key) if f[key] then return f[key] end return function() print(string.format("bar: %s", key)) end end mt = { __index = bar } t = {} setmetatable(t, mt) t.foo() -- prints: "foo" t.bar() -- prints: "bar: bar" t.baz() -- prints: "bar: baz"

在Lua 5.3上测试过.