我从文档中了解到,我们在Lua中没有类。Lua没有类的概念;每个对象都有自己的行为和形状。
因此,Lua中类的简单模拟,遵循基于原型的语言(如Self和NewtonScript)的引导,将类似于。
function Account:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
这里我不明白的是o = o
做什么,为什么我们需要使用setmetadatatable和下一行index = self
。
它是做什么的,为什么我们需要它们?
同样self.o = o
是很容易理解的,但o = o
,这不会产生任何冲突吗?
https://www.lua.org/pil/16.1.html
A = B or C
是常用的习惯用法,依赖于逻辑运算符的短路求值。如果第一个操作数B不为null或false,则A获取B的值,而不计算另一个操作数。如果B为null或false,则A得到c的值
在这个特殊的习语应用程序中,当没有给出参数o
时,o
获得新空表的默认值,因为缺失的参数计算结果为空值。参数o
是一个局部变量,所以给它赋值的所有效果都将保留在Account:new()
函数的局部。
第一行见vlad的答案
setmetatable(o, self)
将self
赋值为o
的元表。self
现在可以包含一组元方法来为o
添加功能(参见链接获取更多信息)。
__index
是当o
不包含索引键时调用的元方法。也可以是另一张桌子。在本例中,__index
被设置为self
,因此,如果您试图在o
中索引一个nil值,它将在self
中查找。如果只调用Account:new()
,则self
为Account
。
示例链接:您在Account
中有一个存款功能。创建对象o = Account:new()
之后,现在可以调用o:deposit()
。这将在o
中查找存款,失败,然后在__index=Account
中查找deposit
,成功,调用它。
如果没有设置元表或__index
,调用o:deposit()
会得到一个attempt to call a nil value
。