在Ruby中表达无限枚举器`(1..Inf)`的常见快速方法是什么?

时间:2014-11-17 23:44:08

标签: ruby enumerator

我认为无限枚举器对于编写FP样式脚本非常方便,但我还没有找到一种在Ruby中构建这种结构的舒适方法。

我知道我可以明确地构建它:

a = Enumerator.new do |y|
    i = 0
    loop do
        y << i += 1
    end
end
a.next  #=> 1
a.next  #=> 2
a.next  #=> 3
...

但这对于这样一个简单的结构来说很烦人。

另一种方法是使用Float::INFINITY

的“黑客”
b = (1..Float::INFINITY).each
b = (1..1.0/0.0).each

这两个可能是我能给出的最笨拙的解决方案。虽然我想知道是否还有其他更优雅的方法来构建无限的枚举器。 (顺便说一下,为什么Ruby不会将infinfinity作为Float::INFINITY的文字?)

2 个答案:

答案 0 :(得分:2)

使用#to_enum#lazyRange转换为Enumerable。例如:

(1..Float::INFINITY).to_enum
(1..Float::INFINITY).lazy

答案 1 :(得分:1)

我个人会为此创建自己的Ruby类。

class NaturalNumbers
  def self.each
    i = 0
    loop { yield i += 1 }
  end
end

NaturalNumbers.each do |i|
  puts i
end