【发布时间】:2021-03-29 14:34:23
【问题描述】:
我刚开始看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
【问题讨论】:
-
在第二个示例中,您将为每个对象创建新的元表。太耗内存了。
-
@EgorSkriptunoff 谢谢。你可以评论我的编辑吗?
-
元表可能和类本身是同一个表,这样会多保存一个表。
-
@EgorSkriptunoff 当然。但是假设我不是在一个每个内存字节都很重要的系统上工作;还有其他理由不使用第三种方法吗?谢谢!
-
第三种方法绝对可以。