使用collect在迭代期间修改数组

时间:2012-10-07 00:54:22

标签: ruby

我正在使用collect方法来更改数组的值。我期待更改数组的值,但这不会发生。在下面的代码中,数组已初始化,值设置为1,2,3,4,5。我将这些值打印到屏幕上,以显示任何更改之前的值。

在将原始数组打印到屏幕后,我遍历数组并使用任何可枚举的.collect方法更改值。

当我将'arr'的值打印到屏幕上时(参见下面的最后一行代码),它会输出与开始数组完全相同的输出!简而言之,'arr'的值在使用collect迭代数组之前和之后是相同的。我预计第一个看法是[1,2,3,4,5],第二个看法是[2,4,6,8,10]。

你能看到我在这里缺少的东西吗?

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

puts arr # outputs 1 2 3 4 5
arr.collect { |x| x * 2 }
puts arr # still outputs 1 2 3 4 5 - not 2 4 5 8 10 as I expect

在相关的说明中,我可以根据自己的意愿更改收藏地图(并使用收藏地图)吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

collectmap的别名)不会修改数组。它返回一个新数组。所以:

arr = arr.collect { |x| x * 2}

如果您确实要修改数组,请使用collect!map!的别名):

arr.collect! { |x| x * 2}

map可与collect互换; map!可与collect!

互换