虽然我并不十分了解Lua,但这是一种相当意外且奇怪的行为。
假设我有my_module.lua
:
local function dump(o) -- SO:9168058
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
local mymodule = {}
function mymodule.myfunction(indict)
print(dump(indict))
end
return mymodule
好吧,现在我运行这个:
lua5.3 -e "mm=require('my_module'); mm:myfunction({aa=12})"
这不应该太复杂-我“导入”模块,并使用作为对象的参数(表/关联数组/字典{aa=12}
)在模块中调用函数。然后,我只是尝试从函数中打印此参数。但是,我得到了:
$ lua5.3 -e "mm=require('my_module'); mm:myfunction({aa=12})"
{ ["myfunction"] = function: 0x5619aeddf770,}
因此,在print(dump(indict))
内对myfunction
的响应,其中indict
是传递给myfunction
的参数,Lua打印.... "myfunction"
? ??!
我什至无法解决这个问题-这怎么可能发生?
我该如何将对象作为参数传递给函数,这样当我从函数内部打印参数时,将打印作为参数的对象,而不是函数本身??!
顺便说一句,即使我只是传递数字而不是对象,也会发生同样的情况,
lua5.3 -e "mm=require('my_module'); mm:myfunction(42)"
编辑:做了一些调试-这样:
function mymodule.myfunction(indict)
print(indict)
print(dump(indict))
end
...使用数字参数时得到此打印输出:
$ lua5.3 -e "mm=require('my_module'); mm:myfunction(42)"
table: 0x55f15a7a07a0
{ ["myfunction"] = function: 0x55f15a7a07e0,}
...因此它根本在任何地方都看不到该数字,但是该函数将自身视为第一个参数。
这让我想起了,在Python类中,如何必须以“ self”作为第一个参数将方法编写为函数,所以我尝试了以下方法:
function mymodule.myfunction(self, indict)
print("self", self, "indict", indict)
print(dump(indict))
end
...打印:
$ lua5.3 -e "mm=require('my_module'); mm:myfunction(42)"
self table: 0x560510b5a7d0 indict 42
42
...或通过物体时
$ lua5.3 -e "mm=require('my_module'); mm:myfunction({aa=12})"
self table: 0x55d51c9d5800 indict table: 0x55d51c9d5880
{ ["aa"] = 12,}
...嗯,更像是它...
任何人都可以解释这是从哪里来的吗–在这种情况下,为什么我需要添加“自我”自变量?
答案 0 :(得分:3)
在lua中,调用a:b(x)
将对对象a
的引用作为函数(self
的第一个(b
)参数传递。
由于您的模块定义是:
function mymodule.myfunction(indict)
并且call语句为mm:myfunction
,对象/表mm
作为第一个参数(此处为indict
)传递。
将函数定义更改为
function mymodule:myfunction(indict)
如果您想保持像mm:myfunction
这样的调用,或者像mm.myfunction
那样调用函数。
有关PiL book的OOP概念中将详细讨论该行为。
冒号的作用是在一个冒号中添加一个额外的隐藏参数。 方法定义,并在方法调用中添加额外的参数。的 冒号只是一种语法功能,尽管很方便。那里 这里真的不是什么新鲜事。