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

Posted

技术标签:

【中文标题】在 Ruby 中迭代数组时如何修改数组?【英文标题】:How do I modify an array while I am iterating over it in Ruby? 【发布时间】:2010-12-18 22:35:31 【问题描述】:

我只是在学习 Ruby,如果这对这里来说太新手了,我深表歉意,但我无法从镐书上解决这个问题(可能只是阅读不够仔细)。 无论如何,如果我有这样的数组:

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

...比如说,我想将数组中的每个值乘以 3,我已经计算出执行以下操作:

arr.each |item| item *= 3

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

我不明白如何在迭代器之后从代码块内部修改原始数组。我相信这很容易。

【问题讨论】:

【参考方案1】:

其他人已经提到 array.map 是这里更优雅的解决方案,但你可以简单地添加一个“!”到 array.each 的末尾,您仍然可以修改数组。添加“!”到#map、#each、#collect等末尾会修改现有数组。

【讨论】:

【参考方案2】:

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

arr2 = arr.map |item| item * 3

使用map!就地修改数组:

arr.map! |item| item * 3

在线查看:ideone

【讨论】:

如果你真的需要修改每个元素,使用 map 肯定会更优雅,恕我直言。 如果你想修改数组本身使用map!而是【参考方案3】:
arr.collect! |item| item * 3

【讨论】:

【参考方案4】:

要直接修改数组,请使用arr.map! |item| item*3。要基于原始数组(通常更可取)创建新数组,请使用arr.map |item| item*3。事实上,我在使用each 之前总是三思而后行,因为通常有一个像mapselectinject 这样的高阶函数可以满足我的需求。

【讨论】:

不想做枚举操作怎么办?如果你只想做类似arr.map! destructive_op 来永久更改arr 怎么办? @TrevorAlexander:我不确定你的意思。作为一个包含细节和内容的真实问题可能值得提出。 我得考虑一下。除了非常狭窄的元素修改之外,还有哪些结构上的破坏性操作是不可枚举的? @TrevorAlexander:我仍然很难理解。如果您无法查看结构的内容,则无法转换其内容。听起来您对修改结构不感兴趣,而只是想分配一个变量——但我可能误解了。

以上是关于在 Ruby 中迭代数组时如何修改数组?的主要内容,如果未能解决你的问题,请参考以下文章

迭代时添加到数组

Ruby 迭代器

Ruby迭代器

在迭代其范围时修改Swift数组 - 0到count,startIndex到endIndex

在迭代数组咖啡脚本时检查undefined

迭代器对象numpy.nditer在数组上进行迭代——修改数组的值