Lua 元表 __index 定位的差异

Difference in Lua metatable __index positioning

我一直看到两种在元表上定义 __index 的方法:

Account = {}
Account.__index = Account

function Account.create(balance)
   local self = { balance = balance }
   return setmetatable(self, Account)
end

或者:

Account = {}

function Account.create(balance)
   local self = { balance = balance }
   return setmetatable(self, { __index = Account })
end

我不太明白两者在行为上的区别。有没有大神能指教一下?

区别在于创建的 table 数量和创建的 table 链。

在第一个示例中,帐户兼作所有 实例的共享元table 以及__index 元方法的查找目标。创建如下链:

instance -> Account, __index -> Account

在第二个示例中,从 create 方法返回的每个 实例 都有其自己的唯一元 table,它充当 实例和'class'。创建的链:

instance -> (anonymous, unique table), __index -> Account

有时您还会看到 tables 作为他们自己的 metatables:

Account = {}

function Account.create(balance)
   local self = { balance = balance, __index = Account }
   return setmetatable(self, self)
end

创建这条链的:

instance -> instance, __index -> Account

第一种和第三种样式的好处是table创建的少,可以简化一些实现,减少内存占用。第二种风格可以说更健壮,因为每个实例都有自己的元table,然后可以单独操作。

您使用的样式实际上取决于程序的要求,以及您对实现任何给定样式的舒适程度table。