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

我刚开始学习 Lua,看到了介绍 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 指出第二种方法会创建太多元表。好的,我理解了(事实上,这显然是很明显的)。但是第一种方法仍然感觉有点奇怪(例如,它反复在 Account 上设置 __index)。也许像这样做可以满足两个反对意见?

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

function Account:new (o)
  o = o or {}
  setmetatable(o, Account_meta)
  return o
end
点赞
用户1236045
用户1236045

我认为这种方法的唯一原因是将其与下一节中的继承联系起来。

那里的继承实现是通过使用SpecialAccount = Account:new()SpecialAccount对象创建原型,然后使用instance = SpecialAccount:new()创建新的SpecialAccount实例。

如果我们想让这种方法正常工作,这两个调用中的一个必须将SpecialAccount.__index设置为SpecialAccount。假设我们想要__index仅在原型/元表/类上设置,那么它必须是第二个调用。虽然在每个对象创建期间需要重复一次赋值操作,但我猜想这不被认为重要,因为这只是一个示例。

2020-12-21 16:30:45