Переопределение элементов массива в «каждом» цикле - PullRequest
1 голос
/ 09 мая 2011
a = [1, 2, 3]
a.each do |x| x+=10 end

После этой операции массив a все еще равен [1, 2, 3]. Как конвертировать его в [11, 12, 13]?

Ответы [ 3 ]

7 голосов
/ 09 мая 2011

Используйте метод collect!:

a = [1, 2, 3]
a.collect!{ |x| x + 10 }
5 голосов
/ 09 мая 2011

Существует два основных класса решений:

Императивный объектно-мутирующий код

a.map! { |x| x + 10 }

Anпочти функциональный решение

a = a.map { |x| x + 10 }

Обе техники имеют свое место.

2 голосов
/ 09 мая 2011

Мне нравится псевдоним "карта" сам. В нем меньше символов.

Разница с этими методами по сравнению с тем, что вы сделали, в два раза. Во-первых, вы должны использовать метод, который изменяет исходный массив (обычно это методы взрыва или методы, имена которых заканчиваются на! (Map !, collect !, ...) .each - это метод, обычно используемый для простого прохождения массива с использованием отдельных элементов. Методы Map или Collect возвращают массив, содержащий возврат от каждой итерации блока.

Следовательно, вы могли бы сделать следующее:

a = [1,2,3]
b = []
a.each do |x| 
   b << x+10
end

или вы можете использовать карту или метод сбора, как продемонстрировано dmarko или как здесь:

a = [1,2,3]
a = a.map {|x| x+10}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...