我在学红宝石..。我对编程很陌生
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获得输入,而且它甚至不在那里。
没有块局部变量
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>请帮助我理解它是如何工作的。
发布于 2017-02-02 10:15:05
第一个
fiber.resume调用在第一个Fiber.yield之前执行所有语句,当执行Fiber.yield时,它在第一个fiber.resume之后将控制转移到行,值(first+2)成为第一个fiber.resume的返回值,因此puts fiber.resume打印12。
这几乎是正确的。这个街区实际上已经停在这里了:
fiber = Fiber.new do |first|
second = ...纤维被挂在作业的中间。分配无法完成,因为Fiber.yield将控制返回到调用上下文,并传递12。
然后调用fiber.resume 14恢复光纤,并且可以完成分配:
fiber = Fiber.new do |first|
second = 1414是第二次简历传递的值。
块现在可以完成,fiber.resume返回。但这一次,返回值由块的返回值(即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)https://stackoverflow.com/questions/41998506
复制相似问题