Lua 使用元表时将函数的参数传递给另一个函数

Lua 使用元表时将函数的参数传递给另一个函数,lua,Lua,在本例中,我正在学习lua并开始学习元表部分 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.ne

在本例中,我正在学习lua并开始学习元表部分


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)

在这部分

function tb.add(s1,s2)

return s1.s..s2.s

end
f= tb.new("W")
t= tb.new("E")
print(f+t)
如何将
super.s
中的值传递到
tb.add
函数。我注意到s1.s中的变量
s
中的s2.s返回s1.s..s2.s
似乎是
tb.new
tb.add
之间的链接

在这一部分

function tb.add(s1,s2)

return s1.s..s2.s

end
f= tb.new("W")
t= tb.new("E")
print(f+t)

当编译器到达
f+t
时,我认为这个函数首先被调用
f=tb.new(“W”)
在这个函数中现在没有
s2
,所以它应该是零
如何返回s1.s..s2.s
发生?

tb.new
基本上只是创建一个新表并返回它,所以在这段代码中:

f= tb.new("W")
t= tb.new("E")
f
t
是新创建的表,每个表都有一个
s
字段,并且都具有相同的元表

解释器在看到
f+t
时自动调用
meta.\uu add
,并将两个操作数作为参数传递
tb.add
有两个参数,并假设这两个参数都有一个
s
字段,该字段是一个字符串,因此所有参数都可以完全检出。如果
t
不是带有
s
字段的表,那么您将遇到麻烦


换句话说,
tb.new
不会将
s
传递到
tb.add
tb.new
在新表中存储
s
,而
tb.add
从其参数中检索该值。

您的代码缺少一个表
tb
。否则,将导致索引nil值时出错

您的代码分别使用一个字段
s=“E”
s=“W”
创建两个表值。两者都共享实现
\u add
元方法的相同元表
meta

Lua中的每个值都可以有一个元表。这个元表是一个普通的表 Lua定义原始值在下的行为的表 某些事件。您可以更改用户行为的几个方面 通过在其元表中设置特定字段来设置值。比如说什么时候, 非数值是加法的操作数,Lua检查 函数在值的元表的uu add字段中。如果找到一个, Lua调用此函数来执行加法


因此,对于
f+t
将调用
meta.\u添加(f,t)
,返回
f.s..t.s
,如@lhf所评论,并由@pigge所回答,代码未按原样工作。
下面是一个使用/显示新Lua 5.4
warn()

的更正版本 它可以用于调试,因为
@on
@off
允许您控制输出。
这是

if warn==nil then warn=print else warn('@on') end
local meta={}
local tb={}

function tb.new(s)
 warn('tb.new("'..s..'")')
 local super={}
 super.s=s
 setmetatable(super,meta)
 return super
end

function tb.add(s1,s2)
 warn('__add('..tostring(s1)..', '..tostring(s2)..')')
 return s1.s..s2.s
end

meta.__add=tb.add

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

print('Print: ',f+t)
输出是

Lua warning: tb.new("W")
Lua warning: tb.new("E")
Lua warning: __add(table: 0x5661f510, table: 0x5661f580)
Print:  WE

(在早于5.4的Lua版本中,使用的是
print()
,而不是
warn()

代码不能正常工作。它需要
local tb={}
,然后它似乎工作了。我忘了添加它。我现在就编辑它。谢谢你的回答,它似乎我需要研究字段。谢谢你的回答。