相等元方法的执行方式似乎有所变化,但是我无法在任何5.1,5.25.3参考手册中找到文档(在“不兼容”下的“语言更改”下)

t1a = {}
t1b = {}
t2  = {}
mt1 = { __eq = function( o1, o2 ) return 'whee' end }
mt2 = { __eq = function( o1, o2 ) return 'whee' end }

setmetatable( t1a, mt1 )
setmetatable( t1b, mt1 )
setmetatable( t2,  mt2 )

print( t1a == t1b )     --> true
print( t1a == t2 )      --> false


来自(http://lua-users.org/wiki/MetatableEvents),并在本地5.1.5实施中经过测试证明是正确的

在Lua 5.3中运行实际上会产生

true
true


从(https://www.lua.org/demo.html)执行

这是一个错误吗?平等的元方法不再必须是相同的参考吗?

最佳答案

我不是Lua专家,但是比较5.2 docs


“ eq”:==操作。函数getequalhandler定义Lua如何选择用于相等的元方法。仅当比较的两个值的类型和所选操作的元方法都相同且值是表或完整的用户数据时,才选择元方法。


5.3 docs


__eq:等号(==)。行为与加法操作类似,只是Lua仅在被比较的值是两个表或两个完整的用户数据并且它们本来就不相等时才尝试元方法。调用结果始终转换为布尔值。


5.3文档中没有列出操作数具有相同的元方法的要求。

10-08 04:00