【问题标题】:infinite enumerator rewind无限枚举器倒带
【发布时间】:2012-11-05 20:47:07
【问题描述】:

我有一个以下列方式生成枚举器的函数:

def create_example_enumerator(starting_value)
  current = starting_value
  e = Enumerator.new do |y|
    loop do
      current += 1
      y << current
    end
  end
end

当前的行为非常简单。

> e = create_example_enumerator(0)
#<Enumerator: details>
> e.next
1
> e.next
2
> e.rewind
#<Enumerator: details>
> e.next
3

我希望e.rewind 将枚举器重置为其初始值。 有没有一种很好的方法可以在仍然使用无限枚举器的同时做到这一点?

【问题讨论】:

    标签: ruby enumerator


    【解决方案1】:

    这应该可行:

    n = Enumerator.new do |y|
      number = 1
      loop do
        y.yield number
        number += 1
      end
    end
    
    n.next #=> 1
    n.next #=> 2
    n.next #=> 3
    n.rewind
    n.next #=> 1
    

    【讨论】:

    • 您可能想用文字表达解决方案:“变量必须在枚举器块内定义”,因为您还将&lt;&lt; 更改为yield,这似乎是问题所在。知道为什么有必要吗?
    • 我认为这是有道理的——倒带应该从块的开头重新开始。如果您没有在块内定义初始编号,那么当您从块的开头重新开始时,您的编号不会改变。
    猜你喜欢
    • 2013-05-18
    • 2019-03-25
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多