为什么第一个示例构造函数在 `self` 上设置了 `__index`?

问题描述

我刚刚开始研究 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,它必须是第二个。这会花费我们在每个对象创建期间重复一次分配,但我想就示例而言,这并不重要。