首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua: lua_resume和lua_yield参数用途

Lua: lua_resume和lua_yield参数用途
EN

Stack Overflow用户
提问于 2012-11-17 05:09:08
回答 3查看 1.8K关注 0票数 6

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-17 05:28:01

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

代码语言:javascript
复制
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)

将打印

代码语言:javascript
复制
1 1
10 1
100 1
票数 10
EN

Stack Overflow用户

发布于 2012-11-17 05:19:21

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

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2020-05-06 20:16:30

一个简单的例子:

代码语言:javascript
复制
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))

打印:

代码语言:javascript
复制
First  args:    1       2
true    11      12
Second args:    1       2
true    11      12

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13424445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档