有没有办法使用each
就地更新值?例如,
[1,2,3].each{|i| i = i * i }
不会产生[1, 4, 9]
。我可以使用map!
或collect!
,但我想知道是否有办法与each
做类似的事情。
答案 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]