【问题标题】:How to pass a function as a parameter in Lua?如何在Lua中将函数作为参数传递?
【发布时间】:2013-06-03 18:52:42
【问题描述】:

对这一切有点困惑;所以这就是我想要做的! 因此有一个定义:

block_basic_DEF =
{
    image = "button.png",
    name = "basic block",
    obj_table = this_obj_table.common_objects_table,
    startup = function() init(), <----- This is the problem
}

在我访问的另一个文件中,如预期的那样:

function spawn(params)
    local obj = display.newImage(params.image)
    -- etc.

在那个 block_basic_DEF 中,我希望传递 init() 函数的地址,这样在我的 spawn 中我可以执行以下操作:

params.startup() --即实际调用了原来的init函数

【问题讨论】:

  • "因此有一个定义" 这不是一个“定义”。 Lua 没有“定义”。那是一个table,它是一个value。就像函数一样。
  • params.startup() 实际上将params 引用的值视为一个表,并用字符串startup 对其进行索引以获取其值(点运算符)。然后它将值作为函数调用(括号运算符)。然后,该函数将 init 引用的值作为函数调用。

标签: function lua


【解决方案1】:

Lua 函数只是值,您可以使用它们的名称来分配它们,而无需使用括号:

function init() 
     print("init");
end

block = { 
     startup = init
}

然后像普通函数一样调用它

block.startup()

它接近于OOP,但实际上它就像一个函数是一个正常值一样简单。

如果你想要更类似于 lambda 的东西,你必须拼出整个函数,省略名称:

startup = function() print("init") end

【讨论】:

  • 谢谢!。问题是我的 init() 函数是在我引用它之后定义的。我更喜欢文件顶部的定义和数据,而不是整个文件(我也总是看起来很乱)。我怎样才能转发引用的东西?干杯
  • 正确使用的 Lambda 函数不会乱七八糟。是时候放弃古老的 C 习语并继续前进了:)
  • @MarkHula:对于前向引用,您需要在文件顶部声明要使用的变量。如果它是局部变量,您可以使用local var1, var2, var3 行声明它们。如果声明过多的名称很难看,您可以声明一个“命名空间”表local M = {},然后使用字段作为变量:M.var1 = ...。最后,除了命名空间表是隐式的之外,全局变量也可以这样工作。
【解决方案2】:

您只是忘记了 end 关键字。它是函数定义的一部分,你不能忽略它。您也不会在 C 中省略结束 } 吗?

block_basic_DEF =
{
    image = "button.png",
    name = "basic block",
    obj_table = this_obj_table.common_objects_table,
    startup = function() init() end, -- <-- This was the problem
}

除此之外,以下两种语法变化是相等的:

function foo()
end

foo = function()
end

【讨论】:

  • 但是,如果您声明 local function,则语法并非 100% 相等。为了能够递归调用函数,您需要在赋值之前声明变量:local foo; foo = function() end
  • 这正是代码示例中没有local 的原因;)
猜你喜欢
  • 2012-12-16
  • 2013-07-13
  • 2017-07-11
  • 1970-01-01
  • 2018-10-11
  • 2013-02-13
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
相关资源
最近更新 更多