2012-12-30 4 views
15

ブロック/ proc/lambdaを使用したRuby二重パイプ割り当て?

@foo ||= "bar_default" 

または

@foo ||= myobject.bar(args) 

を書き出すことができるように本当にいいですが、私は

@foo ||= do 
    myobject.attr = new_val 
    myobject.other_attr = other_new_val 
    myobject.bar(args) 
end 

ような何かを書くための方法があるかどうかを確認するために探しています実際の機能コードではほぼ同等のものになります

@foo = if [email protected]? 
     @foo 
     else 
     myobject.attr = new_val 
     myobject.other_attr = other_new_val 
     myobject.bar(args) 
     end 

そして、 "getblock"のような独自のグローバルメソッドをラップして一般的なブロックの結果を返すことができると思いますが、これを行うための組み込みの方法があるかどうかは疑問です。

+0

ですか? – mlt

答えて

37

あなたはbegin .. end使用することができます。

@foo ||= begin 
    # any statements here 
end 

またはおそらく別のメソッドにブロックの内容を因数分解を検討します。

+0

ありがとう、なぜ私はこれを考えなかったのか分からない。 – Misterparker

0
@foo ||= unless @foo 
    myobject.attr = new_val 
    myobject.other_attr = other_new_val 
    myobject.bar(args) 
end 
2

私は通常、それはこのように書く:それはすべて、スレッドセーフ

@foo ||= (
    myobject.attr = new_val 
    myobject.other_attr = other_new_val 
    myobject.bar(args) 
) 
関連する問題