I try to teach my friend how lua, basically, and he comes to me with this code, and he drinks my head:
a = {name = "aaa"}
function a:new()
self.x = "sss"
o = {}
setmetatable(o, self)
self.__index = self
return o
end
function a:some()
return "[ " .. self.name .. " ]"
end
b = a:new()
print(b:some())
print(b.x)
which prints
[ aaa ]
sss
both should not be possible since they were never installed on the o
insidea:new
after some debugging, I look into it, and here some interesting things happen:
a = {name = "aaa", x = "sss"}
function a:new()
o = {}
print(o.x, self.x)
-- nil sss
setmetatable(o, self)
print(o.x, self.x, o, self, self.__index, o.__index)
-- nil sss table: 0x1001280 table: 0x1001320 table: 0x1001320 nil
self.__index = self
print(o.x, self.x, o, self, self.__index, o.__index)
-- sss sss table: 0x1001280 table: 0x1001320 table: 0x1001320 table: 0x1001320
return o
end
Note that on the third print
it returns a value .x
self
, but it was called from o
, which has no "relationship" with "I", how is this possible?
source
share