2011-10-19 12 views
8

W bloku IF muszę sprawdzić, czy jakiś warunek jest prawdziwy, a jeśli tak, wyjść z bloku.Ruby - wyjście z bloku IF

#something like this 
if 1 == 1 
    return if some_object && some_object.property 
    puts 'hello' 
end 

Jak mogę to zrobić?

Odpowiedz

12

nie można złamać z tego if. Co można zrobić, to dodać Subklauzuli do niego:

if (cond1) 
    unless (cond2) 
    # ... 
    end 
end 

Jeśli masz problemy z logiką zbyt zagnieżdżona i trzeba sposób spłaszczyć go lepiej, może to, co chcesz zrobić, to obliczyć zmienną przed ręką, a potem tylko zanurzyć się, jeśli chcesz:

will_do_stuff = cond1 
will_do_stuff &&= !(some_object && some_object.property) 

if (will_do_stuff) 
    # ... 
end 

Istnieje wiele sposobów, aby uniknąć konieczności głęboko zagnieżdżone struktury bez konieczności break go.

+2

+1 do wcześniejszego obliczenia zmiennej, która nadaje nazwę warunkowi. Dobre imię znacznie poprawi czytelność. –

+0

Zalecam unikanie tego i definiowanie więcej metod, jeśli trzeba. Jest to wzorzec, z którego korzysta Rails i działa bardzo dobrze. Podziel metody na najbardziej atomową rzecz, z którą możesz żyć - w tym przypadku inna metoda (prywatna?) W tej samej klasie/obiekcie może być użyta do przetestowania tego warunku. Na przykład. 'def will_parse? (obj); ! obj.nil? && obj.respond_to? (: parsować) && obj.is_ready_and_willing ?; end' – coreyward

+0

Co to jest "&& ="? –

2

Należy zachować ostrożność przy wybieraniu słów, które kojarzą się z rzeczami. Ponieważ Ruby ma bloki, nie jestem pewien, czy masz wrażenie, że instrukcja warunkowa jest blokiem. Nie można, na przykład, wykonaj następujące czynności:

# will NOT work: 
block = Proc.new { puts "Hello, world." } 
if true then block 

Jeśli trzeba mieć zagnieżdżony warunkowe, można zrobić tylko, że bez komplikowania rzeczy istnieją:

if condition_one? 
    if condition_two? 
    # do some stuff 
    end 
else 
    # do something else 
end 
+0

To jest trochę mylące, ponieważ jeśli zmieniłeś drugi wiersz tego pierwszego fragmentu na "jeśli jest prawdziwy, a potem blokował.", To zadziałałoby – DaveMongoose

+0

@DaveMongoose To dlatego, że nazywasz metodę "zadzwoń" na Proc instancji, ale dzięki za downward – coreyward

+0

jest tam przeciwny przykład czegoś w ruby, który jest blokiem, ale może być podstawiony dla instancji proc (jak 'blok')? Myślę, że składnia wymaga, aby był on '& block', jeśli używasz go zamiast bloku jawnego. – DaveMongoose