Lua 定义“原型内部索引”;建造商;还是外面
我正在读《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毫秒 我的问题是,如果我们可以在外部定义并执行一次,
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
outsidenew
函数并获得相同的行为。如果new
方法分配\uu index
,则将对每个子对象执行此操作,而无需手动执行。谢谢!我只是用OO术语来简单地解释自己。但对于您的示例,不需要添加o.。\uu index=o
,因为o
从Account表获取其元表。还是我错了?问题不在于代码本身,也不在于lua语法,而在于放置指令的“不太好的地方”。如果我们调用o:new()
,则必须使用o.\uu index=o
,在这种情况下,第一个o
将成为下一个o的元表。每个对象都必须有一个\u索引
才能作为原型。伙计,我明白了!你说得对,我们需要在每个派生对象中链接我们的\uu索引
,否则原型的原型将有一个没有\uu索引
的元表。在创建新表的函数中定义点击比在每个“子类中定义点击要简单得多。