ruby具有一个方便的函数,用于枚举each_cons
。这"迭代了连续元素的每个数组的给定块"。这真的很好。除了这绝对是each
方法,它在完成后返回零,而不是您像map
一样循环的值。
但是,如果我有一个情况,需要迭代枚举类型,采取元素及其缺点,然后对它们进行一些操作,然后将它们返回到一个数组中,该怎么办?通常,我会使用地图作为这种行为。但是map_cons
不存在。
一个例子:
给出了整数列表,我需要查看这些整数中的哪一个重复并返回这些整数的列表
[1, 1, 4, 5, 6, 2, 2] ## I need some function that will get me [1, 2]
我可以说:
[1, 1, 4, 5, 6, 2, 2].each_cons(2) {|e| e[0] if e[0] == e[1]}
但是,由于它在数组上的each
s,它将成功完成并在末尾返回nil
。我需要它像map
一样行为,而不是each
。
这种行为是Ruby支持的吗?我是从错误的方向完全抓住它吗?
每个_cons的文档以这个无辜的短语结尾:"如果没有给出块,则返回枚举者。"大多数枚举方法都这样做。您可以用枚举者做什么?没有什么真正令人印象深刻的。但是枚举者包括枚举,确实提供了大量强大的方法,map
是其中之一。因此,就像Stefan Pochmann所做的那样:
[1, 1, 4, 5, 6, 2, 2].each_cons(2).map { |e| e[0] if e[0] == e[1] }
each_cons
无块,因此返回枚举者。map
只是其方法之一。
只需添加 map
?
[1, 1, 4, 5, 6, 2, 2].each_cons(2).map { |e| e[0] if e[0] == e[1] }
=> [1, nil, nil, nil, nil, 2]
ruby 2.7添加了方法filter_map,这使它变得更容易:
p [1, 1, 4, 5, 6, 2, 2].each_cons(2).filter_map{|a,b| a if a == b} # => [1, 2]