ruby是否支持可枚举的map_cons方法或等效方法?

011*_*112 4 ruby arrays cons

Ruby对名为的枚举有一个方便的功能each_cons。其中“为每个连续元素数组迭代给定的块”。真的很好 除了这绝对是一个each方法,该方法在完成时返回nil,而不是像您那样循环遍历的值的数组map

但是,如果遇到需要遍历可枚举类型的情况,请获取一个元素及其缺点,然后对它们执行一些操作,然后将它们返回到数组中,该怎么办?通常,我会将map用于这种行为。但是map_cons不存在。

一个例子:

给定一个整数列表,我需要查看那些整数中的哪些重复并返回仅包含这些整数的列表

[1, 1, 4, 5, 6, 2, 2] ## I need some function that will get me [1, 2]
Run Code Online (Sandbox Code Playgroud)

我可以说:

[1, 1, 4, 5, 6, 2, 2].each_cons(2) {|e| e[0] if e[0] == e[1]}
Run Code Online (Sandbox Code Playgroud)

但是,由于它each在数组上,因此它将成功完成并nil在最后返回。我需要它表现得像map和不像each

这是ruby支持的行为吗?我是完全从错误的方向出发吗?

ste*_*lag 9

each_cons的文档以以下纯真短语结尾:“如果未给出块,则返回一个枚举数。” 大多数Enumerable方法都可以做到这一点。枚举器可以做什么?没有什么真正令人印象深刻的。但是Enumerators包含Enumerable,它确实提供了大量强大的方法,map其中之一就是Enumerable 。因此,正如Stefan Pochmann所做的那样:

[1, 1, 4, 5, 6, 2, 2].each_cons(2).map { |e| e[0] if e[0] == e[1] }
Run Code Online (Sandbox Code Playgroud)

each_cons在没有任何块的情况下被调用,因此它返回一个Enumerator。map只是其方法之一。

  • 由于我们正在处理对,请考虑使用 `map { |a, b| 如果 a == b }`。 (2认同)
  • 也许并不真正令人印象深刻,但没有块的枚举器仍然很方便。例如, `enum = [:even, :odd].cycle #=> #<Enumerator: [:even, :odd]:cycle>; 枚举.下一个; #=>:偶数;enum.next #=> :奇数; enum.next #=> :甚至`... (2认同)

Ste*_*ann 5

只需添加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]
Run Code Online (Sandbox Code Playgroud)