gpt4 book ai didi

ruby - 枚举器 new 和 yield

转载 作者:数据小太阳 更新时间:2023-10-29 09:00:58 24 4
gpt4 key购买 nike

在 ruby​​ docs 我找到了这段代码:

fib = Enumerator.new do |y|
a = b = 1
loop do
y << a
a, b = b, a + b
end
end

问题是我无法理解它的作用。一般来说,它计算斐波那契数,但我很难理解细节。什么是 y (Enumerator::Yielder)docs什么也没说。什么是<<方法呢? (我知道它的产量别名)。 y << a时为什么会出现死循环被删除了?谢谢!

最佳答案

考虑以下代码:

fib = Enumerator.new do |y| 
puts "Enter enumerator"
a = b = 1
loop do
puts "Inside loop"
y << a
puts "y: #{y.inspect}, a: #{a}, b: #{b}"
a, b = b, a + b
end
end
puts fib.take(5)

它打印:

# Enter enumerator
# Inside loop
# y: #<Enumerator::Yielder:0x000000059a27e8>, a: 1, b: 1
# Inside loop
# y: #<Enumerator::Yielder:0x000000059a27e8>, a: 1, b: 2
# Inside loop
# y: #<Enumerator::Yielder:0x000000059a27e8>, a: 2, b: 3
# Inside loop
# y: #<Enumerator::Yielder:0x000000059a27e8>, a: 3, b: 5
# Inside loop

# 1
# 1
# 2
# 3
# 5

显然,此输出实际上给出了您提出的所有问题的提示。请注意,我们只输入了一个 yielder 一次。让我们深入探讨:

为什么 loop是无限的吗?

因为斐波那契数列是无限的。此枚举器旨在与 Enumerable#take 一起使用(参见上面的示例。)

什么是Enumerator::Yielder

它是一种抽象。这是方法yield实际上回调被调用者的 block ,传递一个参数作为 block 参数。

什么是<<方法呢?

产量一次。换句话说,它回调调用者代码,将它的参数传递给调用者的 block 。在此特定示例中,它将回调 each block ,传递 a来自 Yielder实例作为 block 参数(e 我在那里命名。)

为什么y << a时会出现死循环被移除了?

因为没有yield发生了。在我的示例中,被调用方将在产生五次(5 作为 take 的参数)次后停止。

关于ruby - 枚举器 new 和 yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35826375/

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