Inheritance Lua元表索引定位的差异
我一直看到在元表上定义Inheritance Lua元表索引定位的差异,inheritance,lua,prototype,metatable,Inheritance,Lua,Prototype,Metatable,我一直看到在元表上定义\u索引的两种方法: Account = {} Account.__index = Account function Account.create(balance) local self = { balance = balance } return setmetatable(self, Account) end 或: 我不太明白这两个人在行为上有什么不同。有人能告诉我吗?区别在于创建的表的数量和创建的表链 在第一个示例中,Account兼作所有实例的共享元表
\u索引的两种方法:
Account = {}
Account.__index = Account
function Account.create(balance)
local self = { balance = balance }
return setmetatable(self, Account)
end
或:
我不太明白这两个人在行为上有什么不同。有人能告诉我吗?区别在于创建的表的数量和创建的表链
在第一个示例中,Account兼作所有实例的共享元表以及\u索引
元方法的查找目标。创建类似于链的:
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
第一种和第三种样式的好处是创建的表更少,这可以简化一些实现,并减少内存占用。第二种样式可以说更健壮,因为每个实例都有自己的元表,可以单独操作
您使用的样式实际上取决于程序的要求,以及您对实现任何给定样式的舒适程度。谢谢!这很有帮助。然而,我不太理解选项3。典型的用例是什么?@tyrondis选项三主要是表的元表的任意性的一个例子。实例可以控制自己的元方法,而不需要像选项2中那样的单独的元表,这一点非常有用,虽然有点简练,明白了!谢谢你的帮助!
instance -> instance, __index -> Account