2012-12-30 19 views
15

Es ist wirklich schön, dass man schreibenRuby Doppelrohr Zuweisung mit Block/proc/Lambda?

@foo ||= "bar_default" 

oder

@foo ||= myobject.bar(args) 

aber ich habe mich zu sehen, ob es einen Weg gibt, etwas wie

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

schreiben grob äquivilent in tatsächlich Funktionscode zu etwas wie

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

Und ich denke, ich könnte meine eigene globale Methode wie "getblock" schreiben, um das Ergebnis eines allgemeinen Blocks zu umbrechen und zurückzugeben, aber ich frage mich, ob es bereits eine eingebaute Möglichkeit dafür gibt.

+0

Ist es Thread-sicher? – mlt

Antwort

37

können Sie verwenden begin .. end:

@foo ||= begin 
    # any statements here 
end 

oder den Inhalt des Blocks in einem separaten Verfahren Factoring vielleicht in Betracht ziehen.

+0

Danke, nicht sicher, warum ich nicht daran gedacht habe. – Misterparker

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

ich in der Regel schreiben Sie es wie folgt aus:

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