lua-users home
lua-l archive

Lua 5.3 changes to .__eq

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hi,
I'm a little confused abut the changes to .__eq in Lua 5.3. Now that Lua will
call the first .__eq found if *either* of the two operands to == has a defined
.__eq method, some odd results seem to follow. In particular, == is now order
dependent. x == y and y == x can return different results. Is this really
desirable?
Consider the code below and the results it would yield for Lua 5.3 versus for
earlier versions of Lua:
 foo, bar = {4}, {4}
 mt1, mt2 = {}, {}
 happy = function () return true end
 sad = function () return false end
 mt1.__eq = happy
 mt2.__eq = sad
 
 print(foo == bar, bar == foo) -- false, false for all versions
 
 setmetatable(foo, mt1)
 print(foo == bar, bar == foo) -- false, false or true, true?
 
 setmetatable(bar, mt2)
 print(foo == bar, bar == foo) -- false, false or true, false?
For what it's worth, this already has some real-world implications. A number of
testing libraries (and probably others) provide methods to test whether two
tables or objects are "the same". I found out about the changes to Lua while
discussing what I thought was a bug in such a testing library:
https://github.com/Olivine-Labs/luassert/issues/125
Thanks, Peter
-- 
We have not been faced with the need to satisfy someone else's
requirements, and for this freedom we are grateful.
 Dennis Ritchie and Ken Thompson, The UNIX Time-Sharing System

AltStyle によって変換されたページ (->オリジナル) /