你在enumerator.new做什么做| y |

时间:2016-06-17 17:58:26

标签: ruby enumerator

我无法绕过它。我试图咨询ruby-doc on enumerator,但没有多大帮助。

来自ruby-doc:

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

我不明白的是,为什么我不能写fib = Enumerator.new,但我必须写fib = Enumerator.new do |y|

y是什么类型的对象?执行y或执行fib.nextfib.take(5)执行的操作是什么?

2 个答案:

答案 0 :(得分:1)

您正在使用的表单接受一个块作为参数,其中值number = request.form.get('number', type=int) 可以是您想要的任何值。

调用y时,值fib.next被“屈服”给调用者。正如您在示例中所看到的,块调用循环并在每次迭代时计算一个值。所以y是一个积累值的数组。

所以在fib枚举器上调用y会产生“前10个斐波纳契数。接下来打电话会“屈服”第十一个,依此类推。即使它们不需要,也可以将此枚举器视为“无限”。

另一个人为的例子:

take(10)

这里,枚举器反复产生一个“concat”字符串。 This是一篇较旧的文章,但枚举器是可枚举的,因此您可以使用此类中的方法,也可以通过调用concat = Enumerator.new do |c| cat = "concat" loop do c << cat cat += "concat" end end p concat.take(5) 来查看。

答案 1 :(得分:0)

  

我不明白的是,为什么我不能写fib = Enumerator.new,但我必须写fib = Enumerator.new do | y |?

在您拨打nexttake(5)之前,您已创建了一个不会评估任何内容的枚举器

y是引用您的枚举器的本地范围变量。基本上,您正在将块枚举器放到块do..end并在枚举器上应用您自己的逻辑,因此在访问它时,它会计算为您想要的值。