2014-11-17 12 views
5

Penso che l'enumeratore infinito sia molto conveniente per scrivere script in stile FP ma non ho ancora trovato un modo comodo per costruire tale struttura in Ruby.Qual è il modo più veloce di esprimere l'infinito enumeratore `(1..Inf)` in Ruby?

so di poter costruire in modo esplicito:

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

ma questo è fastidiosamente verboso per una struttura così semplice.

Un altro approccio è una sorta di "hack" di usare Float::INFINITY:

b = (1..Float::INFINITY).each 
b = (1..1.0/0.0).each 

Questi due sono probabilmente la soluzione meno goffo che posso dare. Anche se mi piacerebbe sapere se ci sono altri modi più eleganti di costruire infiniti enumeratori. (A proposito, perché non basta fare Rubino inf o infinity come letterale Float::INFINITY?)

risposta

2

Usa #to_enum o #lazy per convertire il vostro Range a un Enumerable. Ad esempio:

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

Grazie. Non sapevo di "pigro". Sembra essere un ottimo modo per simulare meglio i principi FP. – trVoldemort

1

Io personalmente creare il mio classe Rubino per questo.

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

NaturalNumbers.each do |i| 
    puts i 
end 
+0

E se volessi 'def f (n); (1..1.0/0) .each_with_object ([]) {| i, a | a << i; return a if i * i == n}; FINE'? Penso che sia necessario restituire un enumeratore se non è presente alcun blocco. –