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。
我一直看到两种在元表上定义 __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。