- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在学习 ruby.. 并且我是编程新手
fiber = Fiber.new do |first|
second = Fiber.yield first + 2
end
puts fiber.resume 10
puts fiber.resume 14
puts fiber.resume 18
12
14
FiberError: dead fiber called
我的想法是,第一个 fiber.resume 调用执行第一个 Fiber.yield 之前的所有语句,当执行 Fiber.yield 时,它将控制转移到第一个 fiber.resume 之后的行,并且值 (first+2) 成为返回值第一个 fiber.resume 所以 fiber.resume 打印 12,所以下一行也是 fiber.resume。现在,第一个 Fiber.yield 转移了控制权,因此当您调用第二个 fiber.resume 时,应该执行 Fiber.yield 之后的下一行。但是在第一个 Fiber.yield 之后没有声明然后我如何得到 14。我读到我们可以得到最后一个声明,但它没有从 fiber.resume 获得输入,它甚至不存在。
没有 block 局部变量
irb(main):007:0> fiber = Fiber.new do |first|
irb(main):008:1* Fiber.yield first + 2
irb(main):009:1> end
=> #<Fiber:0x23fb4a0>
irb(main):010:0>
irb(main):011:0* puts fiber.resume 10
12
=> nil
irb(main):012:0> puts fiber.resume 10
10
=> nil
irb(main):013:0> puts fiber.resume 10
FiberError: dead fiber called
from (irb):13:in `resume'
from (irb):13
from C:/Ruby23/bin/irb.cmd:19:in `<main>'
irb(main):014:0>
请帮助我了解它是如何工作的..
最佳答案
first
fiber.resume
call executes all statements before firstFiber.yield
, whenFiber.yield
is executed it transfers control to the line after firstfiber.resume
and the value (first+2
) becomes return value of firstfiber.resume
soputs fiber.resume
prints12
这几乎是正确的。该 block 实际上已经在这里停止:
fiber = Fiber.new do |first|
second = ...
光纤在该分配的中间暂停。分配无法完成,因为 Fiber.yield
将控制权交还给调用上下文,传递 12
。
然后调用fiber.resume 14
恢复纤程,即可完成赋值:
fiber = Fiber.new do |first|
second = 14
14
是第二份简历传过来的值。
该 block 现在可以完成,fiber.resume
返回。但这一次,返回值由 block 的返回值决定(即 14
,因为 second = 14
的计算结果为 14
)。
也许这样会变得更明显:
fiber = Fiber.new do |first|
second = Fiber.yield first + 2
third = Fiber.yield second + 3
third + 4
end
puts fiber.resume 10
# prints 12 (10 + 2)
puts fiber.resume 14
# prints 17 (14 + 3)
puts fiber.resume 16
# prints 20 (16 + 4)
puts fiber.resume 18
# dead fiber called (FiberError)
关于Ruby : Fiber yield and fiber. 带参数的简历 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41998506/
我正在学习 ruby.. 并且我是编程新手 fiber = Fiber.new do |first| second = Fiber.yield first + 2 end puts fiber
如何使用 C++ boost 停止(中断)光纤? 例如 fiber.stop() 我如何使用 c+ boost 执行 fiber join(time)(默认 api 不接受最长等待时间)? 例如: f
Fibers被定义为轻量级线程,线程具有优先级,因为它们是抢占式调度的。然而,由于纤维是合作的,它们是否也有优先级? 最佳答案 不,它们本质上没有优先级,因为在协作式多任务处理中,上下文切换目标总是由
我很难理解我应该在我正在处理的代码中的何处实现wrapAsync/bindEnvironment。我正在使用 http/knox 调用 url 并将其上传到我的 S3 存储桶,该存储桶可以正常工作,但
meteor 纤维“同步”模式让我发疯。这是一个简单的代码示例: var feedsData = feeds.fetch(); // [{_id: "1234"}, {_id: "6789", url
void helloFiber(boost::fibers::future &f) { cout pm; boost::fibers::future ft = pm.get_futu
我想知道如何暂停 ruby 中的 Root Fiber(如果可能)。 我有这个 Sinatra 应用程序,我正在使用 EventMachine 对外部 API 进行异步调用。在 API 响应我之前
大家好,我是 polarisxu。 Middleware(中间件) 是一个 Web 框架重要的组成部分,通过这种模式,可以方便的扩展框架的功能。目前 Go Web 框架都提供了 Middlew
我想在 ZIO Fibers 上使用组合器 orElse。 从文档: 如果第一个纤维成功,则合成的纤维将成功,其结果;否则,组成的光纤将以第二条光纤的退出值完成(无论成功或失败)。 import zi
我有以下 ZIO 程序,其中包含两个永久运行的进程: for { .. numberProvider <- numberProvider(queue).fork //
我正在使用 Fibers 来处理不同代码块之间的调度,事实证明这比尝试管理线程要简单得多,因为我的用例相当简单(并且一次只涉及运行一个脚本)。不幸的是,我需要偶尔“杀死”Fiber 的能力,但 Fib
我很难学习 Fibers\coroutines 背后的想法和 Crystal 中的实现。 我希望这是问这个问题的正确地方,我会完全接受“不在这里”的答案:) 这是我在 Ruby 中处理多线程的常用方法
我负责一个 Windows 应用程序,该应用程序加载用 C++ 编写的插件“脚本”dll。 该应用程序公开了一个基于 Win32 纤维的 API,以允许插件 dll 中的 C++“脚本”使用“yiel
部署到其他服务器后,捆绑的 node.fibers 无法加载,并出现以下错误: /home/ec2-user/bundle/server/node_modules/fibers/fibers.js:1
我正在尝试为 Fabrikam Fiber 调用中心下载 Asp.Net 应用程序。 Larry guger 在他关于 http://channel9.msdn.com/Events/TechEd/N
我已成功使用本地上下文通过自定义中间件设置数据库查询结果。我试图了解如何对用户进行身份验证,然后从数据库中提取其详细信息并将其注入(inject)上下文中。这已经完成了。 路由上 final方法上的本
当我收到一个包含要上传到服务器的文件列表的post 请求时,如果我知道它的名称,我可以获取特定文件 c.FormFile("文件名") 但是,如果事先不知道文件名,我该如何遍历该列表中的文件呢?我没有
当我收到一个包含要上传到服务器的文件列表的post 请求时,如果我知道它的名称,我可以获取特定文件 c.FormFile("文件名") 但是,如果事先不知道文件名,我该如何遍历该列表中的文件呢?我没有
我正在使用类星体光纤来监听和处理 QueueObjectChannel 上的消息。我不确定应该使用什么对象作为光纤之间的消息队列。我遇到的问题是我不明白应该将什么传递到 QueueObjectChan
我有以下函数,用作 Windows Fiber 的入口点。 void foo(void*) { for(int i =0; i < 10; ++i) { doStuff(); } } 现在我在
我是一名优秀的程序员,十分优秀!