gpt4 book ai didi

Ruby : Fiber yield and fiber. 带参数的简历 -

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:22 24 4
gpt4 key购买 nike

我正在学习 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 first Fiber.yield, when Fiber.yield is executed it transfers control to the line after first fiber.resume and the value (first+2) becomes return value of first fiber.resume so puts fiber.resume prints 12

这几乎是正确的。该 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com