[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Lua 5.3 changes to .__eq
- From: Peter Aronoff <telemachus@...>
- Date: Sun, 12 Jul 2015 08:20:59 -0400
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