数组元素被懒惰破坏

时间:2014-07-16 17:05:21

标签: ruby map

为什么我们在下面看到这样的差异?为什么这样的阵列呢?

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]]

1 个答案:

答案 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]]

为每个i数组带来第一个x项(因为我们示例中的数组只有2个元素,x.first(3)仍返回两个元素...)。

如果没有lazy

,也会发生同样的情况
enum2 = [1,2].flat_map{[[3,4],[5,6]]}.to_enum.with_index

在这种情况下,to_a的作用是获取枚举中每个项目的两个参数,并将它们转换为单个数组项。