inheritance - Lua元表__index定位的区别

标签 inheritance lua prototype metatable

我不断看到在元表上定义 __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/

相关文章:

javascript - 类型错误:a.dot(...).equals 不是函数

java - Hibernate:继承中对列的附加注释

c++ - 如何在两个不同对象的基类中使用模板化类

lua - 如何将xpcall与具有参数的函数一起使用?

string - Lua中将字符串分割成二维表

regex - 使用 lua 脚本解析 csv

javascript - 将 js 文件从原型(prototype)迁移到 jQuery 不起作用

Java 继承 - this 关键字

css - 当父元素具有更具体的选择器时,为什么我的子元素不从其父元素继承颜色?

javascript - 拦截对构造函数的调用