爲什麼我們在下面看到這樣的差異?爲什麼這樣的數組?數組元素被懶惰損壞
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]]
爲什麼我們在下面看到這樣的差異?爲什麼這樣的數組?數組元素被懶惰損壞
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]]
出現這種情況的原因有無關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
確實在這種情況下,什麼是需要在枚舉各個項目的兩個參數,並把它們變成一個單一的數組項。
@sawa DRY ... Humm? :-) –
我知道..我在開玩笑.. –
同樣的事情發生沒有'懶'... –