6

将参数传递给 lua_resume 和 lua_yield 的目的是什么?

我知道在第一次调用 lua_resume 时,参数被传递给正在恢复的 lua 函数。这是有道理的。但是,我希望所有对 lua_resume 的后续调用都会“更新”协程函数中的参数。然而事实并非如此。

将参数传递给 lua_resume 以使 lua_yield 返回的目的是什么?协程下运行的lua函数能否访问lua_resume传递的参数?

4

3 回答 3

10

尼科尔所说的。如果需要,您仍然可以保留第一次resume调用的值:

do
  local firstcall
  function willyield(a)
    firstcall = a
    while a do
      print(a, firstcall)
      a = coroutine.yield()
    end
  end
end

local coro = coroutine.create(willyield)
coroutine.resume(coro, 1)
coroutine.resume(coro, 10)
coroutine.resume(coro, 100)
coroutine.resume(coro)

将打印

1 1
10 1
100 1
于 2012-11-16T21:28:00.693 回答
5

Lua 不能神奇地赋予原始参数新的值。它们甚至可能不再在堆栈上,具体取决于优化。此外,没有迹象表明代码产生时的位置,因此它可能无法再看到这些参数。例如,如果协程调用了一个函数,则该新函数无法看到传递给旧函数的参数。

coroutine.yield()返回传递给resume继续协程的调用的参数,以便yield调用的站点可以根据需要处理参数。它允许执行恢复的代码与执行屈服的特定代码进行通信。yield()将其参数作为返回值传递给resumeresume并将其参数作为返回值传递给yield。这建立了沟通的途径。

你不能以任何其他方式做到这一点。当然不是通过修改网站上可能看不到的参数yield。它简单、优雅且有意义。

此外,戳别人的价值观被认为是非常粗鲁的。尤其是已经在运行的功能。请记住:参数只是填充了值的局部变量。用户不应该期望这些变量的内容会改变,除非它自己改变它们。local毕竟,它们是变量。它们只能在本地更改;由此得名。

于 2012-11-16T21:19:20.613 回答
0

一个简单的例子:

co = coroutine.create (function (a, b)
       print("First  args: ", a, b)
       coroutine.yield(a+10, b+10)
       print("Second args: ", a, b)
       coroutine.yield(a+10, b+10)
     end)
print(coroutine.resume(co, 1, 2))
print(coroutine.resume(co, 3, 4))

印刷:

First  args:    1       2
true    11      12
Second args:    1       2
true    11      12

显示 args 的原始值ab没有改变。

于 2020-05-06T12:16:30.213 回答