Как изменить массив, когда я повторяю его в Ruby?

Я просто изучаю Ruby, так извиняюсь, если здесь слишком новичок, но я не могу это понять из книги кирку (возможно, просто недостаточно внимательно прочитав). Во всяком случае, если у меня есть такой массив:

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

... и я хочу, например, умножить каждое значение в массиве на 3, я разработал следующее:

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

... не получит меня, что я хочу (и я понимаю, почему я не изменяю сам массив).

То, что я не получаю, - это как изменить исходный массив изнутри блока кода после итератора. Я уверен, что это очень легко.

Ответ 1

Используйте map для создания нового массива из старого:

arr2 = arr.map {|item| item * 3}

Используйте map! для изменения массива на месте:

arr.map! {|item| item * 3}

Посмотрите, как он работает в Интернете: ideone

Ответ 2

Чтобы непосредственно изменить массив, используйте arr.map! {|item| item*3}. Чтобы создать новый массив на основе оригинала (который часто является предпочтительным), используйте arr.map {|item| item*3}. На самом деле, я всегда думаю дважды, прежде чем использовать each, потому что обычно существует функция более высокого порядка, такая как map, select или inject, которая делает то, что я хочу.

Ответ 3

arr.collect! {|item| item * 3}