Lua元表__index定位的区别



我一直看到在元表上定义__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
我不太明白这两者在行为上有什么不同。有人能开导我吗?

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

在第一个示例中,Account既是所有实例的共享元表,也是__index元方法的查找目的地。创建如下链:
instance -> Account, __index -> Account

在第二个例子中,create方法返回的每个实例都有自己独特的元表,作为实例和"类"之间的桥梁。创建的链:

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

有时你也会看到表作为它们自己的元表:

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

创建这个链:

instance -> instance, __index -> Account

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

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

最新更新