Ruby 如何就地更新值

Ruby 如何就地更新值,ruby,Ruby,是否有一种方法可以使用每个更新就地值?比如说, [1,2,3].each{|i| i = i * i } 不产生[1,4,9]。我可以使用地图或收集,但我想知道是否有一种方法可以对每一个执行类似的操作您可以对对象执行此操作,但不能对值执行此操作 a = [{x: 1}, {x: 2}] a.each { |obj| obj[:x] = 3 } a # [{:x=>3}, {:x=>3}] 对于值,赋值会导致局部变量i采用不同的值,但这不会更改数组中的原始整数。可以对对象执行此操作

是否有一种方法可以使用
每个
更新就地值?比如说,

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

不产生
[1,4,9]
。我可以使用
地图
收集
,但我想知道是否有一种方法可以对
每一个

执行类似的操作您可以对对象执行此操作,但不能对值执行此操作

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

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

可以对对象执行此操作,但不能对值执行此操作

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

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

这是一个非常奇怪的请求,但是:

如果数组位于变量中,则很容易:

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 } }

这是一个非常奇怪的请求,但是是的:

如果数组位于变量中,则很容易:

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 } }

您可以在每个块中操纵数组

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

您可以在每个块中操作数组

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

不是
map!
collect!
只是答案吗?你说的每个
都类似于
到底是什么意思?根据于浩所说的,
map!
似乎是正确的使用方法。也许你可以为你正在尝试做的事情提供一个用例?如果这些是我的要求,那么是的,这就是答案,bu我正在做一个练习,上面特别写着“把手从收集/地图/fmap上拿开…”所以不,这不是答案。我正在尝试看看是否有其他方法可以迭代数组并在适当的位置更新它。难道不是
map!
collect!
只是答案吗?你说的与
每个
相似到底是什么意思?借鉴于于浩所说的,
map!
似乎是正确的选择。也许你可以为你要做的事情提供一个用例?如果这些是我的要求,那么答案是肯定的,但我正在做一个练习,它特别说“不要碰收集/映射/fmap…”因此,不,这不是答案。我试图看看是否有其他方法可以迭代数组并在适当的位置更新它。我想他只是问如何使用
每个
实现
映射!
,而不是更改特定整数的指向。如果是这样的话,他甚至不会提到数组。我想他只是问如何chieve
map!
使用
each
,不改变特定整数的指向。如果是这样的话,他甚至不会提到数组。谢谢,第二个选项就是我要找的。instance_eval的用法非常有趣。谢谢,第二个选项就是我要找的。instance_eval的用法非常有趣。是的,@是的,@ndn,但我有很多。:)