Lua 使用元表时将函数的参数传递给另一个函数
在本例中,我正在学习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
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={}
,然后它似乎工作了。我忘了添加它。我现在就编辑它。谢谢你的回答,它似乎我需要研究字段。谢谢你的回答。