2012-12-30 26 views
15

OBlok/proc/lambda ile Ruby çift boru ataması?

@foo ||= "bar_default" 

veya

@foo ||= myobject.bar(args) 

dışarı yazabilmek için gerçekten güzel ama

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

gibi bir şey yazmak için bir yol olup olmadığını görmek için aradım aslında işlevsel kodda yaklaşık olarak eşdeğerli olarak

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

Ve sanırım herhangi bir genel bloğun sonucunu sarmak ve geri döndürmek için "getblock" gibi kendi global yöntemimi yazabilirim, ama bunu yapmak için zaten yerleşik bir yol olup olmadığını merak ediyorum.

@foo ||= begin 
    # any statements here 
end 

ya da belki ayrı bir yöntem haline bloğun içeriğini faktoring düşünün:

+0

mi? – mlt

cevap

37

Sen begin .. end kullanabilirsiniz.

+0

Teşekkürler, neden böyle düşünmediğime emin değilim. – Misterparker

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

Genellikle bu gibi yazmak: tüm iş parçacığı güvenli

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