Lua函数参数是如何传递的?

我正在使用Lua开发一个项目,现在我想在另一个文件中使用另一个类的一些函数。但是似乎对我来说并不起作用。第一个参数没有传递,但我不知道为什么。

文件index.lsp:

dbc = dofile("/home/mako/www/.lua/DBC.lua")
dbc.connectDevice(name, id, ptid)

DBC.lua:

function DBC:connectDevice(name, id, ptid)
 trace(name)
 trace(id)
 trace(ptid)
end

在跟踪中打印出来的是:

1
72893789(ptid)
nil

而不是

ESP
1
72893789

同时,当我改变参数的顺序时,它就像一个偏移量一样,如下所示

index.lsp:

dbc.connectDevice(id, name, ptid)

DBC.lua

function DBC:connectDevice(id, name, ptid)
 trace(name)
 trace(id)
 trace(ptid)
end

在跟踪中打印出来的是:

ESP
72893789(ptid)
nil

而不是

1
ESP
72893789

有人可以给我解释一下我要做什么或者我犯了什么错误吗?

点赞
用户1442917
用户1442917
`dbc.connectDevice(name, id, ptid)` 函数被定义为一个方法,但是却作为一个函数调用了;你可能需要使用 `dbc:connectDevice(name, id, ptid)` 来调用它。

因为你将函数定义为一个方法,所以它期待传递隐式的 `self` 参数,当你将其作为函数调用时,它会将第一个参数作为这个隐式参数,并将所有其他参数移动,这就是你看到的问题。

这一[PiL中的章节](https://www.lua.org/pil/16.html)可能会有所帮助。
2018-05-01 00:13:28
用户3349368
用户3349368

请记住,在 Lua 中,语法 function DBC:connectDevice(name, id, ptid) ... end 只是以下代码的简写形式:

function DBC.connectDevice(self, name, id, ptid)
  ...
end

请注意隐含的 self 参数作为函数的第一个参数。这意味着当您调用函数时,必须将对象作为第一个参数传递,像这样:

DBC.connectDevice(DBC, name, id, ptid)

或者,您可以再次使用冒号语法,隐式传递对象:

DBC:connectDevice(name, id, ptid)
2018-05-01 13:19:19