【发布时间】:2017-02-02 09:29:35
【问题描述】:
我正在学习 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。现在,First 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>
请帮助我了解它是如何工作的..
【问题讨论】:
标签: ruby