首页 > 解决方案 > 为什么第一个示例构造函数在 `self` 上设置 `__index`?

问题描述

我刚刚开始研究 Lua,并且正在研究"classes" 的介绍性 Lua 示例

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 观察到第二种方法会创建太多的元表。好的,我明白了(事实上,这很明显)。但是第一种方法仍然感觉很奇怪(例如,它反复设置__indexon Account)。也许这样的事情会同时满足这两种反对意见?

Account = {balance = 0}
Account_meta = {__index = Account}

function Account:new (o)
  o = o or {}
  setmetatable(o, Account_meta)
  return o
end

标签: lualua-table

解决方案


我相信这种方法的唯一原因是将它与下一节中的继承联系起来。

那里的继承实现用SpecialAccounts创建原型,然后用s 创建SpecialAccount = Account:new()新实例。SpecialAccountinstance = SpecialAccount:new()

如果我们希望这种方法能够正常工作,则必须将这两个调用之一设置SpecialAccount.__indexSpecialAccount. 假设我们只想__index设置原型/元表/类,它必须是第二个。这需要我们在每个对象创建过程中重复一次分配,但我想这并不是为了举例而被认为是重要的。


推荐阅读