Lua 为什么第一个示例构造函数在“self”上设置了“索引”?
我刚开始看Lua,我正在看 我不明白为什么构造器不仅仅是Lua 为什么第一个示例构造函数在“self”上设置了“索引”?,lua,lua-table,Lua,Lua Table,我刚开始看Lua,我正在看 我不明白为什么构造器不仅仅是 function Account:new (o) o = o or {} setmetatable(o, {__index = self}) return o end 我将非常感谢任何有助于理解这一点的帮助 编辑: @Egor观察到第二种方法会创建太多的元表。好吧,我明白了(事实上,这是显而易见的)。但是第一种方法仍然让人感到奇怪(例如,它在帐户上反复设置\uu索引)。也许这样的事情会同时遭到反对 Account = {ba
function Account:new (o)
o = o or {}
setmetatable(o, {__index = self})
return o
end
我将非常感谢任何有助于理解这一点的帮助
编辑:
@Egor观察到第二种方法会创建太多的元表。好吧,我明白了(事实上,这是显而易见的)。但是第一种方法仍然让人感到奇怪(例如,它在帐户上反复设置\uu索引
)。也许这样的事情会同时遭到反对
Account = {balance = 0}
Account_meta = {__index = Account}
function Account:new (o)
o = o or {}
setmetatable(o, Account_meta)
return o
end
我认为这种方法的唯一原因是将其与未来的继承联系起来
那里的继承实现使用SpecialAccount=Account:new()
为SpecialAccount
创建原型,然后使用instance=SpecialAccount:new()
创建SpecialAccount
的新实例
如果我们确实想让这种方法起作用,这两个调用中的一个必须将SpecialAccount.\uu index
设置为SpecialAccount
。假设我们只想在原型/元表/类上设置\u索引
,那么它必须是第二个。在每个对象创建过程中,这会花费我们一次重复的赋值,但我想这并不重要,因为这只是一个例子。我认为这种方法的唯一原因是将它与对象中的继承联系起来
那里的继承实现使用SpecialAccount=Account:new()
为SpecialAccount
创建原型,然后使用instance=SpecialAccount:new()
创建SpecialAccount
的新实例
如果我们确实想让这种方法起作用,这两个调用中的一个必须将SpecialAccount.\uu index
设置为SpecialAccount
。假设我们只想在原型/元表/类上设置\u索引
,那么它必须是第二个。在每个对象创建过程中,这会花费我们一次重复的赋值,但我想这对于一个示例来说并不重要。在第二个示例中,您正在为每个对象创建新的元表。太耗内存了。@EgorSkriptunoff谢谢。您可以对我的编辑发表意见吗?元表可能与类本身是同一个表,这将再保存一个表。@EgorSkriptunoff当然可以。但假设我不是在一个每个字节的内存都很重要的系统上工作;有没有其他理由不使用第三种方法?谢谢第三种方法完全可以。在第二个示例中,您为每个对象创建了新的元表。太耗内存了。@EgorSkriptunoff谢谢。您可以对我的编辑发表意见吗?元表可能与类本身是同一个表,这将再保存一个表。@EgorSkriptunoff当然可以。但假设我不是在一个每个字节的内存都很重要的系统上工作;有没有其他理由不使用第三种方法?谢谢第三种方法完全可以。
Account = {balance = 0}
Account_meta = {__index = Account}
function Account:new (o)
o = o or {}
setmetatable(o, Account_meta)
return o
end