如何正确使用 self 来打印本例中的字符串

How to properly use self to print the string in this example

在这个 MWE 中,我试图在 lua 中编写一个函数,当它被调用时,它会在调用该函数的字符串旁边打印一些文本。

为此,我使用 self 打印字符串,但它实际上是 returns 一个 nil 值。如何正确使用此示例中的 self 以及如何归档此类任务?

str = "Some text on the string"

function string.add()
    print("Hope it prints the string besides too",self)
end

str:add()

输出如下:

Hope it prints the string besides too nil

我想要的:

Hope it prints the string besides too Some text on the string

对于您的函数,string.add(self) 等同于 string:add()。在后一个版本中,它是字符串 class 的成员函数或方法,self 是隐式的第一个参数。这类似于Python中的classes,其中self是每个成员函数的第一个参数。

-- Notice the self parameter.
function string.add(self)
    print("Hope it prints the string besides too", self)
    return
end

str = "Just some text on the string"
str:add()

附带说明一下,如果您要在调用 str:add() 时通过 C API 公开 Lua 堆栈上的项目,则 str 将是堆栈中的第一项,即索引 1 处的元素。项目按传递给函数的顺序被压入堆栈。

print("hello", "there,", "friend")

在此示例中,"hello" 是堆栈中的第一个参数,"there," 是第二个参数,"friend" 是第三个参数。对于 add 函数——写成 str:add()string.add(str)——self,指的是 str,是 Lua堆叠。使用索引运算符定义成员函数,如 string.add 形式,可以提供灵活性,因为可以使用具有显式 self 的形式和具有隐式 self.[= 的形式30=]