Ruby on rails 如何通过引用将变量设置为另一个实例

Ruby on rails 如何通过引用将变量设置为另一个实例,ruby-on-rails,ruby,Ruby On Rails,Ruby,给定以下代码: vars = instance_variables.map(&method(:instance_variable_get)) vars.each {|v| v = 123} 那会设置@something=123吗 更进一步 如果我有也一样吗 vars = instance_variables.map(&method(:instance_variable_get)) vars.each {|v| doSomething(v) } def doSomething(

给定以下代码:

vars = instance_variables.map(&method(:instance_variable_get))
vars.each {|v| v = 123}
那会设置@something=123吗

更进一步

如果我有也一样吗

vars = instance_variables.map(&method(:instance_variable_get))
vars.each {|v| doSomething(v) }

def doSomething(var)
  var = 123
end

如何从函数内部变异var?

您可以在
irb
中快速测试:

@something = 456
instance_variables
# => [:@something]
instance_variables.map(&method(:instance_variable_get)).each { |v| v = 123 }
@something
# => 456 (i.e. "didn't mutate @something")

def doSomething(var)
  var = 123
end
vars = instance_variables.map(&method(:instance_variable_get))
vars.each { |v| doSomething(v) }
@something
# => 456 (i.e. "didn't mutate @something")
但是,确实会更改
@something
的值:

@something = 456
instance_variables.each { |v| instance_variable_set(v, 123) }
@something
# => 123

同意pje,您可能应该在irb中对此进行测试,但我假设您希望为每个实例变量捕获一个setter,因此我建议如下:

setters = instance_variables.map{|v| lambda { |val| instance_variable_set(v, val) }}
然后您只需执行
setters[0]。调用(\uuu VALUE\uuuu)
,它将相应地设置值


你想达到什么目的

但我还需要把钥匙递过来?对于v和key,我指的是实例变量名?是的,
v
在最后一个代码片段中是一个符号:
:@something
,准确地说,您的方法仍然不会改变实例变量。它只是将其设置为一个新值。当你说“mutate”时,通常人们的意思是在不指定新对象的情况下更改现有对象的某些方面,即通过保留被引用对象的
object\u id
。@HolgerJust:真的很好!将答案编辑得更精确。这不是太懒惰,只是好奇传递的原因/方式等的含义。我真的不知道突变/实例变量集等。我将更新我的问题,以反映对知识的更多要求。你能澄清你想要实现什么吗,更改参数的值通常是不好的做法,在许多情况下,不经过一点修改是不容易做到的。