在Ruby中反转可枚举

时间:2012-06-01 16:23:40

标签: ruby enumerable

我试图在不使用reverse方法的情况下反转Enumerable(如Array),但使用reverse_each迭代器。

我希望,以下代码就足够了:

p [1,2,3].reverse_each {|v| v }

然而,块不会以反向的方式返回数组。我当然可以写

[1,2,3].reverse_each {|v| p v }

但我想以第一种方式收集物品。如果这种行为是什么来源,我应该如何编写表达式以满足要求?

3 个答案:

答案 0 :(得分:22)

从1.8.7开始,Enumerable#each_*方法return an enumerator没有提供块时,所以现在可以在纯表达式中使用那些最初的命令方法。

因此,如果您想收集项目,请在该枚举器上使用Enumerable#map

reversed_values = [1, 2, 3].reverse_each.map { |x| 2*x }
#=> [6, 4, 2]

答案 1 :(得分:-1)

另一种方法是[1, 2, 3].reverse_each.to_a

答案 2 :(得分:-1)

(1..3).reverse_each {| v | p v}

产生

1 2 3

它构建一个临时数组并以相反的顺序遍历该数组,但不返回已转换集合的反向副本

如果没有给出阻止,则返回枚举器。

但是红宝石的地图方法

为枚举中的每个元素返回一个新数组,其中包含一次运行块的结果。

p [1,2,3] .reverse_each.map {| v | v}

reverse_each - 将充当迭代器

map - 将形成一组新的集合