gpt4 book ai didi

lua - __index 字段中的表和元表之间的区别

转载 作者:行者123 更新时间:2023-12-01 03:19:27 24 4
gpt4 key购买 nike

我正在用 Lua 学习面向对象的编程。我无法理解在实例的 __index 字段中分配表和为实例设置元表之间的功能差异。我查看了官方 Lua 的引用手册,但我并没有完全掌握其中的区别。例如,要创建 Account 类的实例,它将 Account 类 (self) 的 __index 字段设置为自身,然后将实例的元表设置为 Account 类。

function Account:new (o)
o = o or {}
self.__index = self
setmetatable(o, self)
return o
end

这里发生了什么?在这种情况下,为什么 Account 将自己的索引设置为自己?如果实例 'o' 只是使用 Account 类作为它的元表,那么在这种情况下真正的元表有什么用?为什么 Lua 允许类作为其实例的元表?

根据我的理解,元表应该是仅由元方法(__newindex、__index、__add 等)组成的表。但是该示例将 __index 作为 Account 类的一个字段,此时它不是元表,并且没有分配给它的元表,以便分配查找另一个元表(如果有意义的话)。

提前致谢。

最佳答案

在示例中,Account是元表,o是实例。自 Account被用作一个类,它需要一个 __index字段来定义常规方法。 __index字段在构造函数中定义,因为调用构造函数的行为意味着 Account被用作一个类。

因为定义 __index 有点多余在构造函数中,你会经常看到这样的例子:

Account = {}
Account.__index = Account

function Account:new (o)
o = o or {}
setmetatable(o, self)
return o
end

I am having trouble understanding the functional differences between assigning a table in the __index field of an instance and setting a metatable for the instance.



你一般不放 __index在一个实例中。 (尽管在 PiL 示例中,任何对象都可能用作另一个类。谨慎使用。)为实例设置元表是将元方法应用于该实例的原因。

From my understanding, metatables are supposed to be tables comprised only of metamethods (__newindex, __index, __add, etc.).



元表可以包含的内容没有限制,但是表需要定义至少一个元方法才能在用作元表时产生任何效果。

元方法本质上提供运算符重载。这意味着元表可以定义其他表的行为。 __index是 OOP 真正重要的元方法,因为这就是我们可以使用实例访问类中定义的方法和变量的方式。

为什么元表的 __index通常指向自己?因为否则,我们将需要另一个表来保存常规方法。对于简单的 OOP 框架,让一张表完成两项工作更容易。

简答 :元表为实例定义元方法。 __index是将字段访问路由到另一个表的元方法(如果 __index 是一个表。它也可以是一个函数)。

关于lua - __index 字段中的表和元表之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46749367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com