在lua中将函数用作参数

只是在 Computercraft 中闲逛,尝试将函数用作参数,但无法使其正常工作。

bla = function() print("bla") end
execfunc = function(func) func() end
execfunc(bla())

我想做与上面类似的事情,但使用有效的代码,而不是这个无意义的代码。

点赞
用户258523
用户258523

execfunc 的参数中删除 ()。你想要将 bla 传递给 execfunc,而不是调用 bla() 的结果。

> bla = function() return "bla" end
> execfunc = function(func) print(type(func)) end
> execfunc(bla()) // 输出:string
> execfunc(bla) // 输出:function
2014-08-28 19:31:50
用户2226988
用户2226988

你在形式参数方面没错:在表达式 func 上使用函数调用运算符 () 。如果表达式的值实际上是函数,它就会被调用;否则,Lua 将抛出一个错误。

在实际参数方面,你犯了一个错误。要传递一个参数,只需要在参数列表中放置一个表达式。你想传递变量 bla 中的值,所以使用 execfunc(bla)。表达式只是一个变量,变量中的值是一个函数值并不改变任何事情。

Lua 变量是动态类型的。编译器不跟踪哪些变量在使用之前最后分配了函数值。实际上,它是不能的。你可以编写一个有时返回函数有时返回数字的函数。在任何情况下,你仍然可以尝试调用结果。

local f = function ()
    if Wednesday then
        return 7
    else
        return function (n) return n + 1 end
    end
end

local g = f()
g() -- 变量 g 中的值是一个函数还是不是一个函数?对编译器来说无关紧要。
2014-08-29 02:40:11
用户2248354
用户2248354

获取函数的原始形式而无需调用它的方法是不使用括号 ( )

local function a()
  print("AAA")
end

local function b(func)
   func()
end

b(a)
-- 输出:
-- AAA

对于你的情况:

...
execfunc(bla)
-- 一切都很好,除了你的函数(bla)的圆括号。
2014-08-29 09:13:11