2012-12-30 20 views
15

Jest naprawdę miło być w stanie napisaćPrzypisanie ruby ​​podwójnej z blokiem/proc/lambda?

@foo ||= "bar_default" 

lub

@foo ||= myobject.bar(args) 

ale czekałem, aby sprawdzić, czy istnieje sposób, aby napisać coś podobnego

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

z grubsza odpowiadający faktycznie funkcjonalnemu kodowi, do czegoś podobnego do

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

I przypuszczam, że mógłbym napisać własną globalną metodę, taką jak "getblock", aby zawijać i zwracać wynik dowolnego bloku ogólnego, ale zastanawiam się, czy istnieje już wbudowany sposób, aby to zrobić.

+0

Czy to wszystko jest wątek bezpieczne? – mlt

Odpowiedz

37

Można użyć begin .. end:

@foo ||= begin 
    # any statements here 
end 

czy może rozważyć faktoring zawartość bloku na oddzielnej metody.

+0

Dzięki, nie jestem pewien, dlaczego nie pomyślałem o tym. – Misterparker

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

zazwyczaj piszę to tak:

@foo ||= (
    myobject.attr = new_val 
    myobject.other_attr = other_new_val 
    myobject.bar(args) 
) 
Powiązane problemy