2014-07-16 49 views
1

爲什麼我們在下面看到這樣的差異?爲什麼這樣的數組?數組元素被懶惰損壞

enum = [1,2].lazy.flat_map{[[3,4],[5,6]]}.with_index 

enum.to_a.map(&:first) 
# => [[3, 4], [5, 6], [3, 4], [5, 6]] 

enum.map(&:first).to_a 
# => [[], [5], [3, 4], [5, 6]] 
+0

@sawa DRY ... Humm? :-) –

+0

我知道..我在開玩笑.. –

+0

同樣的事情發生沒有'懶'... –

回答

2

出現這種情況的原因有無關lazy - 它有事情做與map(&:...)的微妙之處。

的第一個選項(enum.to_a.map(&:first))轉換爲:

enum.to_a.map { |x| x.first } 
# => [[3, 4], [5, 6], [3, 4], [5, 6]] 

x[[3,4], 0],然後[[5,6], 1] ...

第二個選項,一個另一方面轉換爲:

enum.map { |x, i| x.first(i) } 
# => [[], [5], [3, 4], [5, 6]] 

它爲每個x數組帶來第一個i項目(因爲我們的例子中的數組只有2個元素,x.first(3)仍然返回兩個元素...)。

同樣會發生不lazy

enum2 = [1,2].flat_map{[[3,4],[5,6]]}.to_enum.with_index 

to_a確實在這種情況下,什麼是需要在枚舉各個項目的兩個參數,並把它們變成一個單一的數組項。

+0

'[1,2] .flat_map {[3,4],[5,6]]}''實際上可以簡化爲'[[3,4],[ 5,6],[3,4],[5,6]]。 – sawa

+0

如果你提到第二個選項,它會更清楚,因爲每個'x'只有兩個元素,'x.first(3)'只能有兩個元素。 – sawa

+0

@sawa - 謝謝,加入 –