如何就地更新价值

时间:2015-07-06 07:51:23

标签: ruby

有没有办法使用each就地更新值?例如,

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

不会产生[1, 4, 9]。我可以使用map!collect!,但我想知道是否有办法与each做类似的事情。

3 个答案:

答案 0 :(得分:2)

您可以使用对象执行此操作,但不能使用值。

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

使用值时,会发生赋值,导致局部变量i采用不同的值,但这不会更改数组中的原始整数。

答案 1 :(得分: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 } }

答案 2 :(得分:1)

您可以在每个区块内操纵数组......

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