我不断看到在元表上定义 __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
第一种和第三种风格的好处是创建的表更少,这可以简化一些实现,并减少内存占用。第二种风格可以说更强大,因为每个实例都有自己的元表,然后可以单独操作。
您使用的样式实际上取决于您的程序的要求,以及您对实现任何给定样式的舒适程度。
关于inheritance - Lua元表__index定位的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973391/