2

我一直看到两种定义元表的方法__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

我不太明白两者之间的行为差​​异是什么。有人可以启发我吗?

4

1 回答 1

3

区别在于创建的表的数量,以及创建的表链。

在第一个示例中,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

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

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

于 2016-08-16T11:30:21.033 回答