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
Lua 索引字段中的表与元表之间的差异_Lua - Fatal编程技术网

Lua 索引字段中的表与元表之间的差异

Lua 索引字段中的表与元表之间的差异,lua,Lua,我正在用Lua学习面向对象编程。我很难理解在实例的_索引字段中分配表和为实例设置元表之间的功能差异。我查阅了Lua的官方参考手册,但我没有完全理解其中的区别。例如,要创建Account类的实例,它将Account类(self)的_索引字段设置为自身,然后将实例的元表设置为Account类 function Account:new (o) o = o or {} self.__index = self setmetatable(o, self) return o end 这是怎么

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

function Account:new (o)
  o = o or {}
  self.__index = self
  setmetatable(o, self)
  return o
end
这是怎么回事?在这种情况下,为什么帐户将自己的索引设置为自身?如果实例“o”只是使用Account类作为其元表,那么在这种情况下,true元表有什么用处?为什么Lua允许类作为其实例的元表

根据我的理解,元表应该是只包含元方法的表(newindex、index、add等)。但是这个例子将_索引作为Account类的一个字段,到目前为止,Account类不是一个元表,也没有为其分配一个元表,这样分配就可以查找另一个元表(如果有意义的话)


提前感谢。

在示例中,
Account
是元表,
o
是实例。由于
Account
被用作一个类,因此它需要一个
\u索引
字段来定义常规方法。
\u index
字段是在构造函数中定义的,因为调用构造函数的行为意味着
帐户
被用作一个类

由于在构造函数中定义
\uuu index
有些多余,因此您经常会看到这样的示例:

Account = {}
Account.__index = Account

function Account:new (o)
  o = o or {}
  setmetatable(o, self)
  return o
end
我很难理解在实例的_索引字段中分配表和为实例设置元表之间的功能差异

您通常不会将
\u索引
放入实例中。(尽管在PiL示例中,任何对象都可能用作另一个类。请谨慎使用。)为实例设置元表是将元方法应用于该实例的方法

根据我的理解,元表应该是只包含元方法的表(newindex、index、add等)

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

元方法本质上提供了操作符重载。这意味着元表可以定义其他表的行为
\uu index
是面向对象编程中真正重要的元方法,因为这就是我们可以使用实例访问类中定义的方法和变量的方式

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


简短回答:元表定义实例的元方法
\uuu index
是将字段访问路由到另一个表的元方法(如果
\uu index
是一个表,它也可以是一个函数)。

感谢您的快速回答。关于分配“Account.\u index=Account”,我是否可以正确地说,只有当我希望用户创建Account实例时才需要分配,否则就不需要分配?是的。我不知道还有什么其他理由这么做。好的,谢谢!这很有帮助。我现在终于明白了。我来自C++/Java/C#的背景,因此Lua版本的面向对象设计需要对我的思维方式进行一些调整。很乐意提供帮助。别忘了把答案标为已接受。(请参见向上/向下投票箭头下方的复选标记。)