Ruby支持枚举的MAP_CONS方法还是等效的



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]

相关内容

  • 没有找到相关文章

最新更新