2015-07-06 2 views
0

Есть ли способ обновить значения на месте с помощью each? Например,Как обновить значение на месте

[1,2,3].each{|i| i = i * i } 

не производит [1, 4, 9]. Я мог бы использовать map! или collect!, но мне было интересно, есть ли способ сделать что-то подобное с each.

+8

Это не 'карта!' Или 'собирать!' Просто ответ? Что именно вы имеете в виду *, похожее на 'each' *? –

+2

, ссылаясь на то, что сказал Юхао, «карта!» Кажется правильной для использования. возможно, вы могли бы предоставить прецедент за то, что вы пытаетесь сделать? – dax

+0

Если бы это были мои требования, тогда да, это был бы ответ, но я упражняюсь в упражнении, и он говорит конкретно: «Держите свои руки в стороне от сбора/карты/fmap ...», поэтому нет, это не ответ. Я пытаюсь увидеть, есть ли другие способы перебора массива и обновить его на месте. –

ответ

2

Это очень странная просьба, но да:

Если массив в переменной легко:

numbers = [1, 2, 3] 
numbers.each.with_index { |number, index| numbers[index] = number * number } 

Если это не так, все сложнее. Я понятия не имею, почему вы хотите изменить его на месте, если у вас нет ссылки на него, но здесь мы идем:

[1, 2, 3].instance_eval { each.with_index { |number, index| self[index] = number * number } } 
+1

Спасибо, второй вариант был тем, что я искал. Действительно интересное использование instance_eval. –

2

Вы можете сделать это с помощью объектов, но не со значениями.

a = [{x: 1}, {x: 2}] 
a.each { |obj| obj[:x] = 3 } 
a # [{:x=>3}, {:x=>3}] 

При значениях, присвоение происходит вызывая локальную переменную i принимать различные значения, но это не меняет исходное целое внутри массива.

+0

Я думаю, что он просто спрашивал, как достичь «карты!» С «каждым», а не изменять то, на что указывает конкретное целое число. Он бы даже не упомянул массив, если бы это было так. – ndn

1

Вы можете управлять массив в пределах каждого блока ...

array = [1, 2, 3] 
array.each {i = array.shift; array << i * i } 
p array 
=> [1, 4, 9] 
+0

Вы зря теряете память. – ndn

+0

Да, @ndn, но у меня его было много. :) – SteveTurczyn

Смежные вопросы