2017-12-31 40 views

答えて

2

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 
+0

ありがとう!あなたはどうやってそれを動かすことができますか?他の側から同じ操作を実行するために 'b ='を手動で定義するだけですか? –

+0

はい、できます。しかし、私の経験では、1つの状態を変更する2つの方法は決して良い考えではありません。それは長期的には面倒なロジックにつながります。 – Aetherus

+0

同じ結果を安全に達成する方法はありますか? –

1

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

+0

ありがとうございます!私はそれがより直接的なので、他の答えと一緒に行きましたが、これは非常に役に立ちました。 –

関連する問題