2012-12-30 9 views
15

E 'davvero bello essere in grado di scrivereRuby double pipe assignment con block/proc/lambda?

@foo ||= "bar_default" 

o

@foo ||= myobject.bar(args) 

ma ho cercato di vedere se c'è un modo per scrivere qualcosa di simile

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

approssimativamente equivoco in codice effettivamente funzionale a qualcosa come

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

E suppongo che potrei scrivere il mio metodo globale come "getblock" per avvolgere e restituire il risultato di qualsiasi blocco generale, ma mi chiedo se esiste già un modo integrato per farlo.

+0

È tutto thread-safe? – mlt

risposta

37

È possibile utilizzare begin .. end:

@foo ||= begin 
    # any statements here 
end 

o forse prendere in considerazione di factoring il contenuto del blocco in un metodo separato.

+0

Grazie, non sono sicuro del motivo per cui non ci ho pensato. – Misterparker

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

solito scrivo in questo modo:

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