b = a + 7
を考えてください。どのようにRubyで相互にバインドする変数のようなものを実現するには?
a
が時間の経過とともに変更されたとしても、b
はa
のままにしておくことができますか?
それだけでなく、どうすれば他の方法でも動作させることができます。a
を更新すると、b
も変更されますか?
b = a + 7
を考えてください。どのようにRubyで相互にバインドする変数のようなものを実現するには?
a
が時間の経過とともに変更されたとしても、b
はa
のままにしておくことができますか?
それだけでなく、どうすれば他の方法でも動作させることができます。a
を更新すると、b
も変更されますか?
Rubyには、相互にバインドする変数はありません。これを実現するために、匿名関数(別名lambda)を使用することができます。
a = 0
b = -> {a + 7}
b.() #=> 7
a = 100
b.() #=> 107
ためb
暗黙的これは私のために少し醜いですが、関数型プログラミングでは良いされていない、a
に依存します。
obj.attr
を使用しても構わない場合は、従来のOOでこれを達成することもできます。
class Foo
attr_accessor :a
def b
a + 7
end
end
foo = Foo.new
foo.a = 0
foo.b #=> 7
foo.a = 100
foo.b #=> 107
Procオブジェクトを使用できます。
a = 1
b = a + 7 #=> 8
proc = Proc.new { b = a + 7 }
#=> #<Proc:[email protected](irb):3>
a = 2
proc.call
b #=> 9
procsとlambasの概要here。
ありがとうございます!私はそれがより直接的なので、他の答えと一緒に行きましたが、これは非常に役に立ちました。 –
ありがとう!あなたはどうやってそれを動かすことができますか?他の側から同じ操作を実行するために 'b ='を手動で定義するだけですか? –
はい、できます。しかし、私の経験では、1つの状態を変更する2つの方法は決して良い考えではありません。それは長期的には面倒なロジックにつながります。 – Aetherus
同じ結果を安全に達成する方法はありますか? –