2016-05-19 9 views
7

Ein Enumerator kann in einem faulen enumerator umgewandelt werden unter Verwendung von Enumerator::Lazy.new wie folgt aus (dies ist ein Beispiel, am Anfang, habe ich bereits einen Enumerator haben, kein Array):Convert enumerator zu faul enumerator

xs_enum = [1, 2, 3].to_enum 
# => #<Enumerator: [1, 2, 3]:each> 
xs_lazy_enum = Enumerator::Lazy.new(xs_enum, &:yield) 
# => #<Enumerator::Lazy: #<Enumerator: [1, 2, 3]:each>:each> 
xs_lazy_enum.force 
# => [1, 2, 3] 

Ist gibt es eine prägnantere Art, es zu tun?

Antwort

4

Was:

[1, 2, 3].to_enum.lazy 
# => #<Enumerator::Lazy: ...> 

der Tat, aber das Problem ist, dass ich von einem enumerator beginnen, nicht aus einem Array

Das ändert nichts:

enum = (1..10).each 
# => #<Enumerator: ...> 
enum.lazy 
# => #<Enumerator::Lazy: ...> 

Enumerable#to_enum gibt einen Enumerator zurück. Wenn Sie einen Anruf an Enumerable#lazy den Empfänger der zweiten Nachricht verketten, wird der Enumerator vom ersten Aufruf zurückgegeben.

+1

Dank, gibt es einige subtility hier, sind die Ausgabe Ihres Schnipsel und meine etwas anders: '=> # > 'vs' # : jedes> '. Ich werde das Beispiel in der Frage ändern. – tokland

+0

Sie haben Recht! Am Ende ist dieser Unterschied nicht relevant, wenn der Enumerator verwendet wird, also ist ein einfacher "enum.lazy" der richtige Weg. – tokland

+0

Sehr gute Antwort auf eine interessante Frage. Beginnen Sie Ihre Antwort einfach mit der Zeile 'enum = (1..10) .each'. –

7

Sie können lazy direkt auf dem Array (oder Enumerator) aufrufen.

[1, 2, 3].lazy 
# => #<Enumerator::Lazy: [1, 2, 3]> 
+0

Schön einfache Antwort! –

Verwandte Themen