【问题标题】:What does y do in enumerator.new do |y|y 在 enumerator.new 中做了什么 |y|
【发布时间】:2016-06-17 17:58:25
【问题描述】:

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

来自 ruby​​ 文档:

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 是什么类型的对象?当fib.next 被执行或fib.take(5) 被执行时,y 在做什么?

【问题讨论】:

    标签: ruby enumerator


    【解决方案1】:

    您使用的表单接受一个块作为参数,其中 y 的值可以是您想要的任何值。

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

    因此,在 fib 枚举器上调用 take(10) 会“产生”前十个斐波那契数。调用 next 将“产生”第十一个,依此类推。这个枚举器可以被看作是“无限的”,即使它们不需要是。

    另一个人为的例子:

    concat = Enumerator.new do |c|
        cat = "concat"
        loop do
            c << cat
            cat += "concat"
        end
    end
    
    p concat.take(5)
    

    这里,枚举器一遍又一遍地产生一串“concat”。 This 是一篇较早的文章,但枚举器是可枚举的,因此您可以使用此类中的方法以及通过调用 take 来查看。

    【讨论】:

      【解决方案2】:

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

      您创建的枚举器在调用 nexttake(5) 之前不会计算任何内容

      y 是引用您的枚举器的局部范围变量。本质上,您将枚举器让给块 do..end 并在枚举器上应用您自己的逻辑,因此当它被访问时,它会计算出您想要的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-23
        • 2019-12-06
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多