'o = o or {}'在卢阿做什么?



我从文档中了解到,我们在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(),则selfAccount

示例链接:您在Account中有一个存款功能。创建对象o = Account:new()之后,现在可以调用o:deposit()。这将在o中查找存款,失败,然后在__index=Account中查找deposit,成功,调用它。

如果没有设置元表或__index,调用o:deposit()会得到一个attempt to call a nil value

最新更新