[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Strange Lua behavior with __eq return values
- From: Matthew Paul Del Buono <delbu9c1@...>
- Date: Thu, 20 Nov 2008 19:00:58 -0500 (EST)
Hi list,
I encountered the following odd behavior while toying with functionality of an application I'm writing (created a semi-minimal test case):
> a = {}; b = {};
> mt = {__eq = function() return 2; end};
> setmetatable(a, mt); setmetatable(b, mt);
> return a == b;
true
> assert(getmetatable(a) == getmetatable(b) and type(getmetatable(a).__eq)=='function')
I would expect "return a==b" to return 2, not true. The assertion passed.
We can tell that the __eq metamethod is obviously being called as naturally a does not equal b. It appears that the return value of __eq is being cast to a boolean. According to the manual:
function getcomphandler (op1, op2, event)
if type(op1) ~= type(op2) then return nil end
local mm1 = metatable(op1)[event]
local mm2 = metatable(op2)[event]
if mm1 == mm2 then return mm1 else return nil end
end
The "eq" event is defined as follows:
function eq_event (op1, op2)
if type(op1) ~= type(op2) then -- different types?
return false -- different objects
end
if op1 == op2 then -- primitive equal?
return true -- objects are equal
end
-- try metamethod
local h = getcomphandler(op1, op2, "__eq")
if h then
return (h(op1, op2))
else
return false
end
end
I see that it should be executing the line "return (h(op1, op2))" but that's not what I seem to get in response. I would expect "true" to be the result if the manual stated "return not not (h(op1, op2))" but it doesn't.
Is this a manual problem, a Lua problem, or am I missing something?
Regards,
-- Matthew P. Del Buono