lua-users home
lua-l archive

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


This post is long so I remove all quotes
Note: the unexpected value of self when o.baz is invoked.

_________________________CODE
require 'dump'

local metainstance = {
    __index = {
        foo = function(self) print(self, 'foo self') return self.v end,
    },
}
setmetatable(metainstance.__index, {
        __index = {
            bar = function(self) print(self, 'bar self') return self.v 
end,
        },
    })
    
setmetatable(getmetatable(metainstance.__index).__index, {
        __index = function(self, key)
            print(self, key, "self, key")
            dump(self, 'self')
            for k,v in pairs(self) do
            	print(k, v, 'k,v')
            end 
            if key == "baz" then 
                print(type(self), (self).v) 
                return rawget(self,'v')  
            end
        end,
    })

local class = {
    new = function(v) local t = {v=v} setmetatable(t, metainstance) 
return t end,
}

local o = class.new(5)
print(o.v, 'o.v')
dump (o, 'o')

local oo = o

print(oo.v, 'oo.v')
dump(oo, 'oo')

print(rawget(o,'v'), "rawget(o,'v')")
print(rawget(oo,'v'), "rawget(oo,'v')")

print( o:foo(), "o:foo()" )
print( o:bar(), "o:bar()" )
print( o:baz(), "o:baz()" )
_____________________________________ OUTPUT
5	o.v
o = {  -- table: 039D0230  ________AS EXPECTED
  v = 5;
  Metatable = ref "table: 039CFB00"; {metainstance!?!}
    __index = {  -- table: 039CFE70
      foo = function: 039DC3D8;
      Metatable = ref "table: 039D0190"; {??????(4)}
        __index = {  -- table: 039D0208
          bar = function: 039DC438;
          Metatable = ref "table: 039D0168"; {??????(6)}
            __index = function: 039DC478;
        };
    };
};
5	oo.v
oo = {  -- table: 039D0230 ________AS EXPECTED
  v = 5;
  Metatable = ref "table: 039CFB00"; {metainstance!?!}
    __index = {  -- table: 039CFE70
      foo = function: 039DC3D8;
      Metatable = ref "table: 039D0190"; {??????(4)}
        __index = {  -- table: 039D0208
          bar = function: 039DC438;
          Metatable = ref "table: 039D0168"; {??????(6)}
            __index = function: 039DC478;
        };
    };
};
5	rawget(o,'v')________AS EXPECTED
5	rawget(oo,'v')________AS EXPECTED
table: 039D0230	foo self________AS EXPECTED
5	o:foo()
table: 039D0230	bar self________AS EXPECTED
5	o:bar()
table: 039D0208	baz	self, key _________UNEXPECTED
self = {  -- table: 039D0208
  bar = function: 039DC438;
  Metatable = ref "table: 039D0168"; {??????(3)}
    __index = function: 039DC478;
};
bar	function: 039DC438	k,v
table: 039D0208	v	self, key
self = {  -- table: 039D0208
  bar = function: 039DC438;
  Metatable = ref "table: 039D0168"; {??????(4)}
    __index = function: 039DC478;
};
bar	function: 039DC438	k,v
table	nil
Lua: Error while running chunk
E:\lua\t.lua:46: attempt to call method 'baz' (a nil value)
stack traceback:
	E:\lua\t.lua:46: in main chunk

Lua: Error while running chunk

good luck
Andre