LuaLuajit:同时编制索引和命名方法?

LuaLuajit:同时编制索引和命名方法?,第1张

概述Lua PIL和 Luajit FFI tutorial在metatable中给出了__index的两个用法. 一个用于索引像obj [123],例如, __index = function(self,k)return self._data(k-self._lower) 另一种用法是定义命名方法,如教程中所给出的, __index = {area = function(a)返回a.x * a.x Lua PIL和 Luajit FFI tutorial在Metatable中给出了__index的两个用法.

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

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

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

__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")endbar = function(_,key)  return function()    print(string.format("bar: %s",key))  endendmmt = { __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")endf = { foo = foo }bar = function(_,key)  if f[key] then return f[key] end  return function()    print(string.format("bar: %s",key))  endendmt = { __index =  bar }t = {}setMetatable(t,mt)t.foo()  -- prints: "foo"t.bar()  -- prints: "bar: bar"t.baz()  -- prints: "bar: baz"

在Lua 5.3上测试过.

@H_419_45@ 总结

以上是内存溢出为你收集整理的Lua / Luajit:同时编制索引和命名方法?全部内容,希望文章能够帮你解决Lua / Luajit:同时编制索引和命名方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1224661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存