我刚开始学习Ruby,如果这个问题太初级了,那就抱歉了。我在《Programming Ruby》这本书里找不到答案(可能是没有仔细阅读)。无论如何,假设我有一个像下面这样的数组:
arr = [1,2,3,4,5]
…而且我想,比如将数组中的每个值乘以3,我已经想出了以下方法:
arr.each {|item| item *= 3}
......不会得到我想要的结果(我明白为什么,因为我没有修改数组本身)。
我不明白的是,如何在迭代器之后的代码块内修改原始数组。我相信这非常容易。
使用map
来从旧数组创建一个新数组:
arr2 = arr.map {|item| item * 3}
使用map!
在原数组中进行修改:
arr.map! {|item| item * 3}
在线演示地址:ideone
要直接修改数组,请使用arr.map!{|item| item*3}
。要基于原始数组创建新数组(通常更好),请使用arr.map {|item| item*3}
。实际上,在使用each
之前,我总是要三思而后行,因为通常有一个高阶函数,比如map
、select
或inject
可以完成我想做的事情。
arr.map!{ destructive_op}
的操作以永久更改 arr
,该怎么办? - bright-stararr.collect! {|item| item * 3}
其他人已经提到了,在这里使用array.map更加优雅的解决方案,但是你可以简单地在array.each的结尾加上一个"!",然后你仍然可以修改数组。在#map、#each、#collect等结尾添加"!"将修改现有的数组。
each!
和 each_with_index!
中都遇到了未定义的方法错误。 - Ryan Pierce Williams