为什么我们在下面看到这样的差异?为什么这样的阵列呢?
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 :(得分: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
的作用是获取枚举中每个项目的两个参数,并将它们转换为单个数组项。