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
Syntax Lua:如何执行从参数传递的回调?_Syntax_Lua_Callback - Fatal编程技术网

Syntax Lua:如何执行从参数传递的回调?

Syntax Lua:如何执行从参数传递的回调?,syntax,lua,callback,Syntax,Lua,Callback,我很幸运地找到了这个问题的答案。我只找到了将回调传递到调用方函数的示例,但没有看到调用方实际上是如何在内部执行回调函数代码的。如果有人能为我提供一个例子和解释,这将是非常感谢 我从函数的角度理解回调是如何工作的,我在其他语言中也使用过回调。我就是搞不懂如何在lua中正确使用语法。我要么执行回调参数错误,要么将其传递到调用方函数错误 这里是我正在尝试做的一些psudocode,只是一个简单的示例,这样我就可以看到它的工作。(我是一名视觉学习者) 编辑: 我得到了一些答案,说我上面的例子是有效的,而

我很幸运地找到了这个问题的答案。我只找到了将回调传递到调用方函数的示例,但没有看到调用方实际上是如何在内部执行回调函数代码的。如果有人能为我提供一个例子和解释,这将是非常感谢

我从函数的角度理解回调是如何工作的,我在其他语言中也使用过回调。我就是搞不懂如何在lua中正确使用语法。我要么执行回调参数错误,要么将其传递到调用方函数错误

这里是我正在尝试做的一些psudocode,只是一个简单的示例,这样我就可以看到它的工作。(我是一名视觉学习者)

编辑: 我得到了一些答案,说我上面的例子是有效的,而且看起来它确实有效。谢谢你,但是我想我应该更具体一些,因为尽管语法正确,我的实际代码仍然不能工作

我正在为使用essentialmode的FiveM服务器编写代码。我试图在脚本中使用回调来清理代码,但它似乎没有启动回调函数。以下是片段

客户端脚本:

RegisterNetEvent("parachute:callback")
AddEventHandler('parachute:callback', function(callback)
    print("callback...")
    callback()
end)
服务器脚本:

callback = function ()
    print("callback fired")
    GiveWeaponToPed(GetPlayerPed(-1), GetHashKey("GADGET_PARACHUTE"), 150, true, true)
    SetPedComponentVariation(GetPlayerPed(-1), 5, 1, 0, 0)
end

TriggerEvent('es:addCommand', 'callback', function(source, args, user)
    TriggerClientEvent("parachute:callback", source, callback)
end, {help = "TEST"})
在上面的例子中,
print(“callback…”)
函数执行,而
callback()
函数不执行。我可以从我添加的打印语句中看出

对于那些不熟悉essential mode或FiveM脚本的人,有一个客户端加载的脚本和一个服务器加载的脚本。在服务器中,
TriggerEvent('es:addCommand',…)
添加一个可以使用
/
执行的命令
TriggerClientEvent()
通过由
RegisterNetEvent()
AddEventHandler()
创建的侦听器启动客户端上的事件。正如您所看到的,您将回调传递给这些函数,告诉它们在触发事件时要执行什么。回调函数本身只是为我的角色提供了一个降落伞。但是,当我键入
/callback
时,没有降落伞


如果不是我最初认为的语法,会出什么问题呢?

它将完全按照您描述的那样工作。您可能希望在回调函数前面添加
local
,但除此之外,您应该做得很好。以下是一个工作示例:

local callback = function ()
    print("here")
end

function caller(callback)
    callback()
end

-- run caller function
caller(callback)

函数可以是lua中的变量,但它们与任何其他变量一样

我不知道你的例子有什么问题,看起来你的例子完全正确。只需输入代码即可()

更新

看起来FiveM和essentialmode是客户机/服务器,运行在两个不同的执行环境中。它们可能为客户端和服务器之间的通信序列化数据,但传递函数将不起作用

通过使用
loadstring()
,您可能可以做一些事情。。。下面是一个可以在jdoodle上运行的示例:

function sayHi(name)
  print("Hello, "..tostring(name).."!")
end

-- create string representation of the function
local functionDef = string.dump(sayHi)

-- convert back to a function
local func = loadstring(functionDef)
func('Jason')

-- or use a string directly, just body, no arguments so
-- we 'return' a function and call it with () after loadstring 
-- to get the returned function - [[ ]] is just syntax for a
-- multiline string
local func2 = loadstring([[
        return function(name) 
          print("Hi there, "..tostring(name).."!")
        end
    ]])()
func2('Jason')
String.dump
将现有函数序列化为字符串,并将其转换回函数。您可以在客户机和服务器之间传递此字符串,但它将在任何环境中执行。您也可以传递函数体,但要获取参数,您必须返回一个在该函数体中包含参数的函数,并调用该函数以获取使用该函数的返回值

如果在客户端上执行
GiveWeaponToPed
SetPedComponentVariation
,则可以发送这些命令来代替“callback”参数,并在客户端中使用loadstring

客户

服务器


澄清一下:有两种变量,全局变量和局部变量(包括循环变量和参数,可以包括
self
)。并且,有几种类型的值,包括函数。说“函数可以是变量”或“全局…函数”听起来很奇怪。不过你的推理是正确的。谢谢你的反馈,我更新了我的问题谢谢你的反馈,我更新了我的问题只是一个尝试,但是你确定这些论点是正确的吗?您能否在打印时转储参数(“回调…”)?可能会添加一个
print('callback type:'…type(callback))
,如果它是k的一个表
,v成对(callback)做print('callback[“…tostring(key)…]:'…tostring(v))end
不确定essentialmode如何工作,但看起来您正在服务器上声明回调函数,并将其与事件一起传递给客户端,以便客户端可以在服务器上调用该函数。我怀疑这会起作用,我认为它们是孤立的环境。是的,我相信这就是原因。我忽略了服务器和客户端有两个不同的地址空间这一事实。如果你编辑你的答案来添加这个(为了完整性),我会接受你的答案为正确答案
function sayHi(name)
  print("Hello, "..tostring(name).."!")
end

-- create string representation of the function
local functionDef = string.dump(sayHi)

-- convert back to a function
local func = loadstring(functionDef)
func('Jason')

-- or use a string directly, just body, no arguments so
-- we 'return' a function and call it with () after loadstring 
-- to get the returned function - [[ ]] is just syntax for a
-- multiline string
local func2 = loadstring([[
        return function(name) 
          print("Hi there, "..tostring(name).."!")
        end
    ]])()
func2('Jason')
RegisterNetEvent("parachute:callback")
AddEventHandler('parachute:callback', function(callback)
    print("callback...")
    loadstring(callback)()
end)
codestring = [[
    GiveWeaponToPed(GetPlayerPed(-1), GetHashKey("GADGET_PARACHUTE"), 150, true, true)
    SetPedComponentVariation(GetPlayerPed(-1), 5, 1, 0, 0)
]]

TriggerEvent('es:addCommand', 'callback', function(source, args, user)
    TriggerClientEvent("parachute:callback", source, codestring)
end, {help = "TEST"})