首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石:纤维产量和fiber.resume参数-

红宝石:纤维产量和fiber.resume参数-
EN

Stack Overflow用户
提问于 2017-02-02 09:29:35
回答 1查看 433关注 0票数 2

我在学红宝石..。我对编程很陌生

代码语言:javascript
复制
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获得输入,而且它甚至不在那里。

没有块局部变量

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

请帮助我理解它是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 10:15:05

第一个fiber.resume调用在第一个Fiber.yield之前执行所有语句,当执行Fiber.yield时,它在第一个fiber.resume之后将控制转移到行,值(first+2)成为第一个fiber.resume的返回值,因此puts fiber.resume打印12

这几乎是正确的。这个街区实际上已经停在这里了:

代码语言:javascript
复制
fiber = Fiber.new do |first|
  second = ...

纤维被挂在作业的中间。分配无法完成,因为Fiber.yield将控制返回到调用上下文,并传递12

然后调用fiber.resume 14恢复光纤,并且可以完成分配:

代码语言:javascript
复制
fiber = Fiber.new do |first|
  second = 14

14是第二次简历传递的值。

块现在可以完成,fiber.resume返回。但这一次,返回值由块的返回值(即14,因为second = 14计算为14)决定。

也许这样会变得更明显:

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41998506

复制
相关文章

相似问题

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