Re: Different behavior when __index is a table or a function
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: Re: Different behavior when __index is a table or a function
- From: Philipp Janda <siffiejoe@...>
- Date: 2014年10月20日 20:24:01 +0200
Am 20.10.2014 um 11:42 schröbte Paco Zamora Martínez:
Dear Lua community,
Hi!
In order to make it clearer, I have written two minimal examples where this
behavior is present:
*setmetatable(getmetatable(metainstance.__index).__index, {*
* __index = {*
* baz = function(self) return self.v end,*
* },*
*})*
*setmetatable(getmetatable(metainstance.__index).__index, {*
* __index = function(self,key)*
* if key == "baz" then return rawget(self,v) end*
* end,*
*})*
Those two are not equivalent! The second one should be something like
setmetatable(getmetatable(metainstance.__index).__index, {
__index = function(self,key)
if key == "baz" then
return function(self)
return rawget(self,"v")
end
end
end,
})
and then you get your expected output of:
> 5
> 5
> 5
A method call using `:` consists of two operations: The fetching of the
function and the function call. The `self` argument of the function call
will always be the top level object, but the arguments of the `__index`
call might not be the top level object depending on how deep the chain is.
So when you try to combine fetching and calling, you can end up with the
wrong `self`.
Philipp