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

时间:2017-12-02 11:32:33

标签: arrays ruby 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]

我可以说:

[1, 1, 4, 5, 6, 2, 2].each_cons(2) {|e| e[0] if e[0] == e[1]}

但是,由于它each在数组上,它将成功完成并在结尾返回nil。我需要它的行为类似于map而不是each

这种行为是ruby支持的吗?我完全是从错误的方向来看它吗?

2 个答案:

答案 0 :(得分:4)

只需添加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]

答案 1 :(得分:4)

each_cons的文档以这个无辜的短语结束:“如果没有给出阻止,则返回一个枚举器。” Enumerable的大多数方法都是这样做的。你能用枚举器做什么? Nothing truly impressive。但是枚举器包括Enumerable,它确实提供了大量强大的方法,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只是其中一种方法。