函数如何在表格字段间导航

我已经在 StackOverflow 上提出了这个问题,并接受了一个答案。但我认为我并没有真正理解这个答案,所以我还有一些问题。我不好意思再去回复之前的帖子,所以我创建了一个新的问题。

我正在学习 Lua,接触了 metatable 部分,在这个例子中:

local tb = {}
local meta = {}

function tb.new(s)
local super = {}
super.s = s

setmetatable(super,meta)

return super
end

function tb.add(s1,s2)

return s1.s..s2.s

end

meta.__add = tb.add

f= tb.new("W")
t= tb.new("E")

print(f+t)

当编译器执行到 f = tb.new("W") 时,我认为会发生以下操作: function tb.new("W") super.W = W return setmetatable(super,meta) return super end 所以 print(f+t) 看起来像 print(super+super) 那么, tb.add(super,super) 如何使用 return s1.s..s2.s 查找 super 表格的字段? 另外,由于 tb.new 函数被调用了两次, setmetatable(super,meta) 发生了两次,第一次和第二次迭代之间有什么区别吗?如果我上面的理解有误,请指正我。

点赞
用户3574628
用户3574628

当编译器到达 f = tb.new("W") 时,我认为会发生如下操作:function tb.new("W") super.W = W return setmetatable(super,meta) return super end

不是这样的。这就是点表示法的方式。我希望这能解释后面 Lua 如何“查找字段”。

由于 tb.new 函数调用了两次并且 setmetatable(super,meta) 也发生了两次,第一次和第二次迭代之间有什么区别吗?

它们是不同的,因为每次 super 变量都是一个新表。无论何时看到 {} (一个表构造器),无论是空的还是非空的,都会创建一个全新的表。然而,meta 仍然是同一个表,因为它只在函数外部得到一个表构造器。

2021-05-23 16:10:43