Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance Lua元表索引定位的差异_Inheritance_Lua_Prototype_Metatable - Fatal编程技术网

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