平等元方法的执行方式似乎有所改变,但我找不到任何5.1,5.2或5.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
from(http://lua-users.org/wiki/MetatableEvents)并在本地5.1.5实现中测试为真
在Lua 5.3中运行它实际上产生了
true
true
执行(https://www.lua.org/demo.html)
这是一个错误吗?那些平等的元方法不再必须是相同的参考吗?
答案 0 :(得分:3)
我不是Lua专家,而是比较documentation:
“eq”:==操作。函数getequalhandler定义了Lua如何选择元方法进行相等。仅当比较的两个值具有相同的类型并且所选操作的相同的元方法时,才会选择元方法,并且值为表或完整的用户数据。
和5.2 docs:
__ eq:等于(==)操作。类似于加法运算的行为,除了Lua将仅在被比较的值既是表或两个完整用户数据并且它们不是原始相等时尝试元方法。调用的结果总是转换为布尔值。
5.3文档列表并不要求操作数具有相同的元方法。
答案 1 :(得分:0)
如果我正在浏览Lua网站上的源代码,那么Lua 5.2和5.3之间就会发生变化。
在Lua 5.2中,如果一对表或userdata不等于引用,则在luaV_equalobj_
中检查两个__eq
元方法的相等性(使用get_equalTM
,其中TM代表for" tag method",metamethods的旧名称),只有这样才能使用metamethod。 (在5.1中,过程类似,但方法称为luaV_equalval
和lua_getcompTM
。)在5.3中,luaV_equalobj
在第一个操作数中查找__eq
元方法,然后在第二个操作数;如果找到任何metamethod,它就会被调用。
2015年在Lua列表上对此进行了讨论:Lua 5.3 changes to .__eq(easier-to-read Nabble version)。