在Lua中,要求功能的论点丢失/消失了吗?

时间:2019-01-27 00:50:04

标签: lua

虽然我并不十分了解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,} 

...嗯,更像是它...

任何人都可以解释这是从哪里来的吗–在这种情况下,为什么我需要添加“自我”自变量?

1 个答案:

答案 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概念中将详细讨论该行为。

  

冒号的作用是在一个冒号中添加一个额外的隐藏参数。   方法定义,并在方法调用中添加额外的参数。的   冒号只是一种语法功能,尽管很方便。那里   这里真的不是什么新鲜事。