在Ruby中迭代数组时如何修改数组?


88

我只是在向Ruby学习道歉,如果这不是这里的新手,但是我无法从镐本书中解决这个问题(可能只是不够仔细地阅读)。无论如何,如果我有一个像这样的数组:

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

...而我想说的是,将数组中的每个值乘以3,我得出以下结论:

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

...不会得到我想要的东西(我知道为什么,我没有修改数组本身)。

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

Answers:


140

用于map从旧阵列创建新阵列:

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

使用map!修改数组到位:

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

看到它在线运行:ideone


2
如果确实需要修改每个元素,使用地图肯定会更加优雅,恕我直言。
fresskoma

2
如果要修改数组本身,请使用map!而是
约恩·乐头尺

18

要直接修改数组,请使用arr.map! {|item| item*3}。要基于原始数组创建一个新数组(通常更可取),请使用arr.map {|item| item*3}。实际上,在使用之前,我总是三思而后行each,因为通常会有一个像的高阶函数mapselect或者inject就是我想要的。


如果您不想执行枚举操作该怎么办?如果您只想做一些arr.map!{ destructive_op}永久改变的事情怎么办arr
明亮的星星,

1
@TrevorAlexander:我不确定你的意思。作为一个包含细节和内容的真实问题,可能值得提出。
Chuck

我得考虑一下。除了非常狭窄的元素修改之外,对结构的破坏性操作是无法枚举的吗?
明亮的星星,

@TrevorAlexander:我仍然很难理解。如果看不到结构的内容,就无法转换其内容。听起来好像您对修改结构不感兴趣,而只想分配一个变量,但我可能会误会。
Chuck

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.