在“each”循环中覆盖数组的元素

时间:2011-05-09 14:38:54

标签: ruby override each

a = [1, 2, 3]
a.each do |x| x+=10 end

此操作后,数组a仍为[1, 2, 3]。如何将其转换为[11, 12, 13]

3 个答案:

答案 0 :(得分:7)

使用collect!方法:

a = [1, 2, 3]
a.collect!{ |x| x + 10 }

答案 1 :(得分:5)

有两类通用解决方案:

势在必行的对象变异代码

a.map! { |x| x + 10 }

几乎functional解决方案

a = a.map { |x| x + 10 }

两种技术都有它们的位置。

答案 2 :(得分:2)

我自己喜欢别名“地图”。它的字符较少。

与您所做的相比,这些方法的差异有两个方面。一个是你必须使用一个修改初始数组的方法(通常这些是爆炸方法,或者名称以!(map!,collect!,...)结尾的方法。第二个是a .each是通常用于遍历数组以使用单个元素的方法.Map或Collect方法返回一个包含块的每次迭代返回的数组。

因此,你可以做到以下几点:

a = [1,2,3]
b = []
a.each do |x| 
   b << x+10
end

或者您可以使用dmarko或此处所示的地图或收集方法:

a = [1,2,3]
a = a.map {|x| x+10}