在Lua协程中传递带自定义参数的函数的方法探究
在Lua协程中传递带自定义参数的函数的方法
你的代码无法运行的核心原因是:b = a(6,3) 这行直接执行了函数a,并把它的返回值(由于a没有显式返回值,实际是nil)赋值给了b,而coroutine.wrap要求传入一个函数作为参数,自然会报错。下面是几种可行的实现方式:
方法1:用匿名函数包装带参数的目标函数
把带参数的调用逻辑封装到匿名函数中,再传给coroutine.wrap:
function a(a,b) print(a+b) end -- 用匿名函数包裹带参数的函数调用 local co_func = coroutine.wrap(function() a(6, 3) end) -- 执行协程 co_func()
方法2:通过闭包预先绑定参数
如果需要重复使用带固定参数的函数,可以用闭包提前把参数绑定好,生成一个无需传参的函数:
function a(a,b) print(a+b) end -- 封装一个参数绑定函数 function bind_args(func, ...) local args = {...} return function() func(unpack(args)) end end -- 绑定参数后生成新函数 local bound_a = bind_args(a, 6, 3) local co_func = coroutine.wrap(bound_a) co_func()
方法3:启动协程时直接传递参数
也可以在启动协程的阶段传入参数,让协程内部的函数接收并使用:
function a(a,b) print(a+b) end -- 协程函数定义参数接收逻辑 local co_func = coroutine.wrap(function(x, y) a(x, y) end) -- 启动协程时传入目标参数 co_func(6, 3)
内容的提问来源于stack exchange,提问作者Tower
相关产品推荐
相关产品推荐

