"Lua coroutine.yield(-1)" 的含义是什么?
2013-12-3 5:12:18
收藏:0
阅读:137
评论:2
coroutine.yield(-1) 是什么意思?我不明白这里的 -1。
代码片段和输出如下:
> function odd(x)
>> print('A: odd', x)
>> coroutine.yield(x)
>> print('B: odd', x)
>> end
>
> function even(x)
>> print('C: even', x)
>> if x==2 then return x end
>> print('D: even ', x)
>> end
>
> co = coroutine.create(
>> function (x)
>> for i=1,x do
>> if i==3 then coroutine.yield(-1) end
>> if i % 2 == 0 then even(i) else odd(i) end
>> end
>> end)
>
> count = 1
> while coroutine.status(co) ~= 'dead' do
>> print('----', count) ; count = count+1
>> errorfree, value = coroutine.resume(co, 5)
>> print('E: errorfree, value, status', errorfree, value, coroutine.status(co))
>> end
---- 1
A: odd 1
E: errorfree, value, status true 1 suspended
---- 2
B: odd 1
C: even 2
E: errorfree, value, status true -1 suspended
---- 3
A: odd 3
E: errorfree, value, status true 3 suspended
---- 4
B: odd 3
C: even 4
D: even 4
A: odd 5
E: errorfree, value, status true 5 suspended
---- 5
B: odd 5
E: errorfree, value, status true nil dead
>
-1 表示在协程中返回一个值为 -1 的 yield 语句。在这段代码中,当 i 等于 3 时,会执行 coroutine.yield(-1)。这会使得协程暂停,并向主代码返回值为 -1。主代码继续运行,直到下一次调用协程的 coroutine.resume 方法。coroutine.resume 方法将协程从暂停状态恢复,并传递一个新的值给协程。在这个例子中,值为 5。协程从 coroutine.yield 语句处继续执行,直到完成所有循环。最后一次调用 coroutine.resume 方法将协程置为死亡状态。
点赞
用户1009479
任何传递给相应coroutine.yield的参数,都会被coroutine.resume返回。所以,在这里coroutine.yield(-1)中的-1并没有什么特殊之处,它类似于函数odd(x)中的coroutine.yield(x)。
它在counter为2且i为3时执行。相应的输出是:
---- 2
B: odd 1
C: even 2
E: errorfree, value, status true -1 suspended
在显示ture(表示无误)之后,你注意到这里的-1吗?那就是调用coroutine.yield(-1)的返回值,它最终成为了coroutine.resume的返回值。
出于同样的原因,coroutine.resume的其他返回值都是1、3和5,这些值都来自函数odd(x)中的coroutine.yield(x)。
2013-12-03 05:18:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
coroutine.yield (···)暂停调用协程的执行。协程不能正在运行C函数、元方法或迭代器。任何传递给
yield的参数都作为额外结果传递给resume。【http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.yield】
换句话说,
-1可以是任何值,甚至多个值,这些值的使用方式由程序员决定。