Lua:lua_resume和lua_yield参数目的

问题描述 投票:6回答:3

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

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

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

lua arguments coroutine
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

5
投票

Lua无法神奇地为原始参数赋予新的值。根据优化情况,它们甚至可能不再位于堆栈中。此外,没有迹象表明代码在什么时候产生的,因此它可能不再能够看到这些参数。例如,如果协程调用了一个函数,则该新函数将看不到传递给旧函数的参数。

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

您无法以其他任何方式这样做。当然不是通过修改从yield网站看不到的参数来实现的。它简单,优雅且有意义。

[而且,嘲笑某人的价值观被认为是极不礼貌的。特别是已经在运行的功能。请记住:参数只是充满值的局部变量。用户不应期望这些变量的内容发生更改,除非它自己更改了它们。毕竟,它们是local变量。它们只能在本地更改;因此得名。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.