Путаница в использовании нотации «.» С __index и пространством имен в Lua
Я запутался в следующих двух синтаксисах, используя "."
Из того, что я понимаю,__index
вызывается, когда ключ не существует в таблице, но существует в ее метатабельной таблице. Так почему же вызывается таблица списка__index
а затем назначить себяlist.__index
?
list = {}
list.__index = list
setmetatable(list, { __call = function(_, ...)
local t = setmetatable({length = 0}, list)
for _, v in ipairs{...} do t:push(v) end
return t
end })
function list:push(t)
if self.last then
self.last._next = t
t._prev = self.last
self.last = t
else
self.first = t
self.last = t
end
self.length = self.length + 1
end
.
.
.
local l = list({ 2 }, {3}, {4}, { 5 })
Есть лиWindow.mt
просто создать таблицу? Зачем намWindow = {}
в качестве пространства имен здесь?
Window = {} -- create a namespace
Window.mt = {} -- create a metatable
Window.prototype = {x=0, y=0, width=100, height=100, }
function Window.new (o)
setmetatable(o, Window.mt)
return o
end
Window.mt.__index = function (table, key)
return Window.prototype[key]
end
w = Window.new{x=10, y=20}
print(w.width) --> 100