我试图在不使用reverse
方法的情况下反转Enumerable(如Array),但使用reverse_each
迭代器。
我希望,以下代码就足够了:
p [1,2,3].reverse_each {|v| v }
然而,块不会以反向的方式返回数组。我当然可以写
[1,2,3].reverse_each {|v| p v }
但我想以第一种方式收集物品。如果这种行为是什么来源,我应该如何编写表达式以满足要求?
答案 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 - 将形成一组新的集合