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编程》中的“面向对象编程”一章 在该示例中,他们创建了这个“构造函数”: Account={balance=0} 功能帐户:新(o) o=o或{}——若用户未提供对象,则创建对象 可设置元(o,自) self.\uuu索引=self 返回o 结束 我在Linux上用一个简单的time脚本制作了一些“Sintic基准测试”,脚本中有1000万个这样的操作。在表外定义Account.\uu index=Account初始化快200毫秒 我的问题是,如果我们可以在外部定义并执行一次,

我正在读《Lua编程》中的“面向对象编程”一章

在该示例中,他们创建了这个“构造函数”:

Account={balance=0}
功能帐户:新(o)
o=o或{}——若用户未提供对象,则创建对象
可设置元(o,自)
self.\uuu索引=self
返回o
结束
我在Linux上用一个简单的
time
脚本制作了一些“Sintic基准测试”,脚本中有1000万个这样的操作。在表外定义
Account.\uu index=Account
初始化快200毫秒

我的问题是,如果我们可以在外部定义并执行一次,为什么要在这个函数中设置每次调用这个函数时都要执行的
self.\u index
?也许是传统

编辑:

谢谢你的回答,我将在这里为所有对此有疑问的人创建一个示例:

locala={}
a、 指数=a
函数a:foo()
返回“foo”
结束
功能a:新(o)
打印(自我)
o=o或{}
可设置元(o,自)
--self.\uuu索引=self
返回o
结束
本地b=a:new()
--b.。_指数=b
函数b:bar()
返回“bar”
结束
本地z=a:new()
print(z:foo())--这将起作用
本地y=b:new()
print(y:foo())--尝试调用方法“foo”(一个nil值)
print(y:bar())--尝试调用方法“bar”(一个nil值)
当然
y
将有一个元表,其中
b
作为该表,但是
b
没有
\u索引
项,该项仅在
b
的元表中。
如果您仍然希望避免在“构造函数”中声明
\uu index
,则需要在每个派生原型或“子类”中指定此项。

PiL的作者似乎试图通过让
新的
方法以处理所有子对象的方式处理根对象来简化事情。这可能会让初学者感到困惑,因为现在还不清楚
self.\uu index=self
通常是多余的

而且,用这种方法比向每个对象添加
\u索引
更快。请记住,在原型系统中,每个对象都可能是其他对象的原型。在我的机器上,通过1e8测试,PiL方式需要14秒,而将
\u index
添加到所有对象需要23秒。一个新的键意味着表必须增长,因此它比分配给一个已经存在的键要慢

令人困惑的是,这个PiL部分的标题是“类”,但在第一段中,他说他正在模拟基于原型的语言,在那里“对象没有类”。这进一步打乱了读者的期望。本节实现一个自复制对象,而不是类

下面是我的解决方案,它不那么令人困惑,但实施速度较慢:

Account = {balance = 0}
Account.__index = Account

function Account:new (o)
  o = o or {}   -- create object if user does not provide one
  setmetatable(o, self)
  o.__index = o
  return o
end

你似乎是对的:
Account.\uu index=Account
更好。它支持子类化
Account
,如下一章所示。是的,我读了,但我仍然可以定义“子类”并编写相同的
SubAccount.\uu index=SubAccount
outside
new
函数并获得相同的行为。如果
new
方法分配
\uu index
,则将对每个子对象执行此操作,而无需手动执行。谢谢!我只是用OO术语来简单地解释自己。但对于您的示例,不需要添加
o.。\uu index=o
,因为
o
从Account表获取其元表。还是我错了?问题不在于代码本身,也不在于lua语法,而在于放置指令的“不太好的地方”。如果我们调用
o:new()
,则必须使用
o.\uu index=o
,在这种情况下,第一个
o
将成为下一个
o的元表。每个对象都必须有一个
\u索引
才能作为原型。伙计,我明白了!你说得对,我们需要在每个派生对象中链接我们的
\uu索引
,否则原型的原型将有一个没有
\uu索引
的元表。在创建新表的函数中定义点击比在每个“
子类中定义点击要简单得多。