2012-06-01 73 views
8

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

我希望,那下面的代码就足够了:

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

然而块不返回逆转orded阵列。当然我可以写

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

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

回答

19

从1.8.7,Enumerable#each_*方法return an enumerator当没有块提供。这很不错:现在许多原本势在必行的方法可以用作功能表达式。

所以,如果你想收集的物品,对枚举使用Enumerable#map

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

的'reverse_each'超级方便!谢谢! –

-1

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

+0

你打电话给阵列上的to_a ... – askl56

+0

糟糕,按照我的意思编辑它 – Dorian

-1

(1..3).reverse_each {| V | PV}

生产:

它建立一个临时数组并穿过以相反的顺序数组,但不返回变换集合的反向复制

如果没有块被给出,而是返回一个枚举器。

但是红宝石的地图方法

返回与在枚举每一次元件运行块的结果的新的数组。

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

reverse_each - 将作为一个迭代

地图 - 将形成一套新的集合