2016-05-19 14 views
7

Numerator można przekształcić leniwe wyliczający stosując Enumerator::Lazy.new tak (to przykład, na początku, już mają wyliczający, a nie tablicą):Konwersja numeratora lazy wyliczający

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] 

jest istnieje bardziej zwięzły sposób na to?

Odpowiedz

4

Co o:

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

Rzeczywiście, ale problemem jest to, że zacznę od wyliczający, a nie z tablicy

To niczego nie zmienia:

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

Enumerable#to_enum zwraca moduł wyliczający. Jeśli wywołujesz połączenie z numerem Enumerable#lazy, odbiorcą drugiej wiadomości jest moduł wyliczający zwracany przez pierwsze połączenie.

+1

Dzięki, istnieją pewne subtility tutaj, wyjście fragmencie i moje są nieco inaczej: '=> # > 'vs' # : each> ". Zmienię przykład w pytaniu. – tokland

+0

Masz rację! Na końcu ta różnica nie jest istotna, gdy używa się modułu wyliczającego, więc proste "enum.lazy" jest drogą do zrobienia. – tokland

+0

Bardzo dobra odpowiedź na interesujące pytanie. Dlaczego po prostu nie rozpoczynać odpowiedzi od linii 'enum = (1..10) .each'. –

7

Możesz bezpośrednio wywołać lazy w tablicy (lub enumeratorze).

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

Pięknie prosta odpowiedź! –