【问题标题】:Ruby : Fiber yield and fiber.resume with arguments -Ruby : Fiber yield 和 fiber.resume with arguments -
【发布时间】: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


    【解决方案1】:

    第一个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 = 14
    

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

    块现在可以完成,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)
    

    【讨论】:

    • 谢谢兄弟,我花了这么多时间来理解
    猜你喜欢
    • 2013-03-18
    • 2016-01-02
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多