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

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

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

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

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

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

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

【问题讨论】:

    标签: ruby arrays iteration


    【解决方案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:我仍然很难理解。如果您无法查看结构的内容,则无法转换其内容。听起来您对修改结构不感兴趣,而只是想分配一个变量——但我可能误解了。
        猜你喜欢
        • 2020-05-29
        • 2016-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        相关资源
        最近更新 更多