在 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
之前总是三思而后行,因为通常有一个像map
、select
或inject
这样的高阶函数可以满足我的需求。
【讨论】:
不想做枚举操作怎么办?如果你只想做类似arr.map! destructive_op
来永久更改arr
怎么办?
@TrevorAlexander:我不确定你的意思。作为一个包含细节和内容的真实问题可能值得提出。
我得考虑一下。除了非常狭窄的元素修改之外,还有哪些结构上的破坏性操作是不可枚举的?
@TrevorAlexander:我仍然很难理解。如果您无法查看结构的内容,则无法转换其内容。听起来您对修改结构不感兴趣,而只是想分配一个变量——但我可能误解了。以上是关于在 Ruby 中迭代数组时如何修改数组?的主要内容,如果未能解决你的问题,请参考以下文章