加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua Metatable不一致

发布时间:2020-12-15 00:26:18 所属栏目:大数据 来源:网络整理
导读:我无法理解为什么这些示例之间的__index元方法的行为存在差异: A = { __index = A } function A:speak() print("I'm an A")endAn_A = setmetatable({},A)An_A:speak() 将引发以下错误:lua:l.lua:8:尝试调用方法’speak'(零值) 同时 B = { __index = fun
我无法理解为什么这些示例之间的__index元方法的行为存在差异:
A = { __index = A }   
function A:speak()
    print("I'm an A")
end
An_A = setmetatable({},A)
An_A:speak()

将引发以下错误:lua:l.lua:8:尝试调用方法’speak'(零值)

同时

B = { __index = function(t,key)  return B[key] end }
function B:speak()
    print("I'm an B")
end
An_B = setmetatable({},B)
An_B:speak()

将按预期执行,输出我是B.

在试图理解为什么会这样的情况下,我阅读了PiL的this部分.它指出:

The use of the __index metamethod for inheritance is so common that
Lua provides a shortcut. Despite the name,the __index metamethod does
not need to be a function: It can be a table,instead. When it is a
function,Lua calls it with the table and the absent key as its
arguments. When it is a table,Lua redoes the access in that table.

我对此的理解是,在涉及’A’的片段中,__ index = A导致访问在表A中完成(根据上面引用的加粗segmenet).如果是这种情况,我不明白为什么找不到与“说话”键相关的功能.为了尝试修复此问题,我决定在B片段中实现函数方法,该片段返回与B中的键相关联的值,并且它起作用.当然__index = A和(改编自B)__ index = function(t,key)返回A [key] end具有相同的效果.

任何澄清将不胜感激.

解决方法

你的第一个例子中发生的是A .__ index == nil.当你在第一行创建’A’时:
A = { __index = A }

赋值’A’的右侧评估为nil,因为此时它尚不存在.因此,稍后在此处设置metatable时:

An_A = setmetatable({},A)

它真的最终做了类似于此的事情:

An_A = setmetatable({},{__index = nil} )

为了让它以你想要的方式工作,你必须确保__index不是零.例如,在表构造之后分配它:

A = {}
A.__index = A

function A:speak()
  print("I'm an A")
end
An_A = setmetatable({},A)
An_A:speak()              --> outputs I'm an A

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读