Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何在Lua中将函数作为参数传递?_Function_Lua - Fatal编程技术网

Function 如何在Lua中将函数作为参数传递?

Function 如何在Lua中将函数作为参数传递?,function,lua,Function,Lua,被这一切搞糊涂了;这就是我想要做的! 有这样一个定义: block_basic_DEF = { image = "button.png", name = "basic block", obj_table = this_obj_table.common_objects_table, startup = function() init(), <----- This is the problem } 在该block\u basic\u DEF中,我希望传递ini

被这一切搞糊涂了;这就是我想要做的! 有这样一个定义:

block_basic_DEF =
{
    image = "button.png",
    name = "basic block",
    obj_table = this_obj_table.common_objects_table,
    startup = function() init(), <----- This is the problem
}
在该
block\u basic\u DEF
中,我希望传递
init()
函数的地址,以便在我的spawn中执行以下操作:


params.startup()
——即实际调用原始的init函数

Lua函数只是值,您可以使用它们的名称而不使用paren来关联它们:

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

block = { 
     startup = init
}
然后像调用正则函数一样调用它

block.startup()
它接近OOP,但事实上,它与函数是正常值这一事实一样简单

如果您想要更类似于lambda的函数,则必须拼写整个函数,省略名称:

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

您刚刚忘记了
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
}

“有一个def,所以”这不是“def”。Lua没有“定义”。这是一个表,它是一个值。与函数一样。
params.startup()
实际上将
params
引用的值视为一个表,并使用字符串
startup
对其进行索引以获取其值(点运算符)。然后将该值作为函数调用(括号运算符)。然后,该函数将
init
引用的值作为函数调用。谢谢!。问题是我的init()函数是在我引用它之后定义的。我更喜欢将定义和数据放在文件顶部,而不是放在整个文件中(我也总是觉得很凌乱)。如何转发参考资料?正确使用的CheersLambda函数并不凌乱。是时候放弃古老的C习惯用法,继续:)@MarkHula:对于正向引用,您需要在文件顶部声明要使用的变量。如果它是局部变量,您可以使用
localvar1、var2、var3
行声明它们。如果声明太多名称很难看,则可以声明单个“名称空间”表
local M={}
,然后使用字段作为变量:
M.var1=…
。最后,除了名称空间表是隐式的之外,全局变量也是这样工作的。但是,如果您要声明一个
局部函数
,则语法不是100%相等的。为了能够递归调用函数,您需要在赋值之前声明变量:
localfoo;foo=function()end
这正是代码示例中没有
local
的原因;)
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