2009-11-21 68 views
74

我只是在学习Ruby,所以对于这里的新手来说,我很抱歉,但是我不能从镐书中解决这个问题(可能只是不够仔细阅​​读)。 无论如何,如果我有这样一个数组:如何在Ruby中对它进行迭代时修改数组?

arr = [1,2,3,4,5] 

...我想,说,乘以3的阵列中的每个值,我曾指出,执行以下操作:

arr.each {|item| item *= 3} 

...不会给我我想要的东西(我明白为什么,我不修改数组本身)。

我没有得到的是如何在迭代器之后从代码块内部修改原始数组。我相信这很容易。

回答

118

使用map创建一个从旧的一个新的数组:

arr2 = arr.map {|item| item * 3} 

使用map!修改数组到位:

arr.map! {|item| item * 3} 

看到它联机工作:ideone

+2

如果你确实需要修改每个元素,使用map肯定会更优雅,imho。 – fresskoma 2009-11-21 00:13:39

+2

如果你想修改数组本身使用map!而不是 – 2009-11-21 10:54:39

16

要直接修改数组,使用arr.map! {|item| item*3}。要根据原始数据创建一个新数组(通常更可取),请使用arr.map {|item| item*3}。事实上,我总是三思而后使用each之前,因为通常像mapselectinject是我想要做什么高阶功能。

+0

如果您不想进行枚举操作,该怎么办?如果你只是想做一些像'arr.map!{destructive_op}'来永久改变'arr'? – 2013-11-27 06:27:27

+1

@TrevorAlexander:我不确定你的意思。这可能是值得作为一个真正的问题与细节和东西。 – Chuck 2013-11-27 19:07:56

+0

我得考虑一下。除了非常狭窄的元素修改之外,对结构的破坏性操作不是可枚举的? – 2013-11-27 21:56:10

5
arr.collect! {|item| item * 3}