Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 元方法的麻烦_Lua - Fatal编程技术网

Lua 元方法的麻烦

Lua 元方法的麻烦,lua,Lua,我想重写这段代码 local tb = {} local meta = {} function tb.new(b) local super = {} super.b = b setmetatable(super,meta) return super end function tb.add(s1,s2) return s1.b+s2.b end meta.__concat = tb.add f= tb.new(3) t= tb.new(4) print(f..t) 在tb=

我想重写这段代码

local tb = {}


local meta = {}

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

setmetatable(super,meta)

return super
end

function tb.add(s1,s2)

return s1.b+s2.b

end

meta.__concat = tb.add

f= tb.new(3)
t= tb.new(4)

print(f..t)
在tb=setmetable{}中,元方法风格和我提出了这个


 local tb = setmetatable({},{__concat = function(a,b)

return a+b
end
})

function ins(a)

tb.a = a

return tb.a

end

print(ins(2)..ins(3))

我想知道为什么它不起作用,我承认我不知道我在做什么,这篇文章需要多少字;-

如果我理解正确,你想要这个

function tb(b)
    return setmetatable({b = b},{__concat = function(s1,s2)
        return s1.b + s2.b
    end})
end

print(tb(3)..tb(4))

如果我没弄错的话,你想要这个

function tb(b)
    return setmetatable({b = b},{__concat = function(s1,s2)
        return s1.b + s2.b
    end})
end

print(tb(3)..tb(4))
决心

print( 2 .. 3)
print("2" .. "3")
print("23")
决定

print( 2 .. 3)
print("2" .. "3")
print("23")
决定

print( 2 .. 3)
print("2" .. "3")
print("23")
哪个输出23

这两个数字都隐式转换为其字符串表示形式,然后将它们连接到单个字符串23

从:

Lua中的字符串串联运算符由两个点表示 '..'. 如果两个操作数都是字符串或数字,则数字为 转换为非指定格式的字符串,见§3.4.3。 否则,调用_concat元方法,见§2.4

第一个代码段连接两个表,而第二个代码段连接两个数字。因此,在第二种情况下,永远不会调用_concat元方法

如果要将这两个数字相加,只需使用printins2+ins3即可。我不明白你为什么要替换简单的算术运算符。这只会增加不必要的混乱

您必须将tb与调用_concat的内容连接起来,而不是它的字段

决心

print( 2 .. 3)
print("2" .. "3")
print("23")
决定

print( 2 .. 3)
print("2" .. "3")
print("23")
决定

print( 2 .. 3)
print("2" .. "3")
print("23")
哪个输出23

这两个数字都隐式转换为其字符串表示形式,然后将它们连接到单个字符串23

从:

Lua中的字符串串联运算符由两个点表示 '..'. 如果两个操作数都是字符串或数字,则数字为 转换为非指定格式的字符串,见§3.4.3。 否则,调用_concat元方法,见§2.4

第一个代码段连接两个表,而第二个代码段连接两个数字。因此,在第二种情况下,永远不会调用_concat元方法

如果要将这两个数字相加,只需使用printins2+ins3即可。我不明白你为什么要替换简单的算术运算符。这只会增加不必要的混乱


您必须将tb与调用您的_concat的内容连接起来,而不是它的字段。

您正在将两个数字连接到字符串中。你期望什么呢?要调用_concat metamethod,您应该连接对象。我希望它们也添加is tb.2和tb.3不是对象?tb.a是对象中的一个字段,该字段包含一个数字。您正在将两个数字连接到字符串中。你期望什么呢?要调用_concat metamethod,您应该连接对象。我希望它们也添加is tb.2和tb.3不是对象?tb.a是对象中的一个字段,该字段包含一个数字。ya我想要这样的答案。感谢回答。我在这部分中遇到了一个问题返回setmetatable{b=b}字段b=b属于哪个表?结核病?但是它是一个函数它只是一个匿名表我想要这样的答案我在这部分有一个问题返回setmetatable{b=b}字段b=b属于哪个表?结核病?但是它是一个函数它只是一个匿名表确实不需要替换简单的运算符我只是想用setmetatable={}.metamethod风格重写第一个示例。因此,如果我想调用uu concat,我是否将tb与另一个表连接起来?,thnx 4答案确实不需要替换简单的运算符,我只是想用setmetatable={}.metamethod样式重写第一个示例。因此,如果我想调用uu concat,我是否要将tb与另一个表连接起来?答案是thnx 4