0

次のコードが与えられた場合:

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 を変更するにはどうすればよいですか?

4

2 に答える 2

1

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")

ただし、Object#instance_variable_setの値を変更します@something:

@something = 456
instance_variables.each { |v| instance_variable_set(v, 123) }
@something
# => 123
于 2012-10-19T21:33:06.833 に答える
1

pjeに同意すると、おそらくirbでこれをテストする必要がありましたが、すべてのインスタンス変数のセッターをキャプチャしたいと考えているので、次のようなものをお勧めします:

setters = instance_variables.map{|v| lambda { |val| instance_variable_set(v, val) }}

それからあなたはただ行うことができsetters[0].call(__VALUE__)、それに応じて値を設定します。

あなたが達成しようとしていることは何ですか?

于 2012-10-19T21:40:00.317 に答える