问题描述
我刚刚开始研究 Lua,我正在研究 introductory Lua example for "classes"。
Account = {balance = 0}
function Account:new (o)
o = o or {}
setMetatable(o,self)
self.__index = self
return o
end
我不明白为什么构造函数不只是
function Account:new (o)
o = o or {}
setMetatable(o,{__index = self})
return o
end
如果您能帮助我理解这一点,我将不胜感激。
编辑:
@Egor 观察到第二种方法会创建太多元表。好的,我明白了(事实上,这很明显)。但是第一种方法仍然感觉很奇怪(例如,它反复在 __index
上设置 Account
)。也许这样的事情会满足双方的反对意见?
Account = {balance = 0}
Account_Meta = {__index = Account}
function Account:new (o)
o = o or {}
setMetatable(o,Account_Meta)
return o
end
解决方法
我认为这种方法的唯一原因是将其与 next section 中的继承联系起来。
那里的继承实现使用 SpecialAccount
创建 SpecialAccount = Account:new()
的原型,然后使用 SpecialAccount
创建 instance = SpecialAccount:new()
的新实例。
如果我们希望这种方法完全起作用,那么这两个调用之一必须将 SpecialAccount.__index
设置为 SpecialAccount
。假设我们只想在原型/元表/类上设置 __index
,它必须是第二个。这会花费我们在每个对象创建期间重复一次分配,但我想就示例而言,这并不重要。