当函数作为参数时发生了什么?

我还在学习lua,对这种语法不太熟悉。像下面这样将函数作为参数传递时会发生什么呢?

Comm.setRouting(function(url)
        for i = 1,4 do
            local portIndex = "Path"..i
            if url:match(portConfig[portIndex]) ~= nil then
                return Comm.slots()[1], Comm.groups()[i]
            end
        end
    end)
点赞
用户421195
用户421195

在这个例子中发生了一些事情:

  1. 你正在将一个函数作为参数传递。被调用者(例如 setRouting())可以调用该函数。这通常被称为 回调函数

  2. 你正在动态地定义函数本身。这是一个“匿名函数”的示例,或者称为lambda 函数

2020-08-14 19:36:46
用户2486299
用户2486299

在这里,你将一个“匿名函数”作为参数传递给 setRouting 函数。

在 Lua 中,函数是一级值,可以存储在局部变量、全局变量和表字段中。这里的函数被匿名地传递到调用栈上的 setRouting 函数中。

setRouting 被称为“高阶函数”,因为它接受一个函数作为输入。

以下页面提供有关 Lua 中函数的更多信息:

https://www.lua.org/pil/6.html

2020-08-14 19:41:26
用户12514997
用户12514997

其他的答案是正确的,但是如果你自己编写一个调用另一个函数的函数可能会有所帮助:

function CallAFunction(func_to_call)
   func_to_call()
end

你可以传递一个命名函数(一个分配给变量的匿名函数)或现场编写的匿名函数。

function SayHello()
   print("Hello!")
end
--[[
^This is equivalent to:
SayHello = function()
   print("Hello!")
end
]]--

CallAFunction(SayHello)
CallAFunction(function()
                  print("Goodbye!")
              end)

输出:

Hello!
Goodbye!

这也可以通过参数实现

function CallAFunction(func)
   func("Bonjour")
end

CallAFunction(function(parameter)
                  print(parameter)
              end)

在这里,func是匿名函数,它接受1个参数parameter

当你调用func("Bonjour")时,你传递Bonj作为parameter,就像普通的函数调用一样。

2020-08-14 20:06:33