2011-11-05 8 views
13

Tak, próbowałem break, next i return. Wszystkie dają błędy, exit oczywiście działa, ale to całkowicie kończy. A więc jak skończyłoby się case...when "zbyt szybko?"Jak "wyrwać" się z przypadku ... podczas gdy w Ruby

Przykład:

case x 
    when y; begin 
     <code here> 
     < ** terminate somehow ** > if something 
     <more code> 
    end 
end 

(Powyższe jest jakaś forma pseudo-kod prostu dać ogólne pojęcie o co pytam [begin ... end był używany z nadzieją, że będzie pracować break .?]

I mimo, że jestem na to, czy jest bardziej elegancki sposób przekazywania bloków case...when

+0

wystarczy zmienić strukturę logiki - patrz poniżej: – Tilo

Odpowiedz

7

Co w tym złego:

case x 
when y; 
    <code here> 
    if !something 
     <more code> 
    end 
end 

Zauważ, że if !something jest taka sama jak unless something

+0

Absolutnie nic! Przenikało mi to przez myśl, ale szukałem sposobu, by to zrobić. Sądziłem, że poza tą jest właściwa droga. Tak więc, jeśli nie ma innego sposobu robienia tego, myślę, że to jest właściwa droga. Dzięki! : D – omninonsense

+0

Niewłaściwe jest wcięcie. Jeśli to nie był błąd, to język nie będzie wcale potrzebował ani "break", ani "next". – Nakilon

4

widzę kilka możliwych rozwiązań. Na pierwszej strony, można zdefiniować blok instrukcji wewnątrz jakiejś metody:

def test_method 
    <code here> 
    return if something 
    <more code> 
end 

case x 
    when y 
    test_method 
end 

Z drugiej strony, można użyć catch-throw, ale wierzę, że to bardziej brzydsze i non-rubinowy sposób :)

catch :exit do 
    case x 
    when y 
     begin 
     <code here> 
     throw :exit if something 
     <more code> 
     end 
    end 
end 
+0

Cóż, jeśli stworzyłem metodę dla każdego przypadku, wyglądałoby to dziwnie, naprawdę dziwnie (i jest wiele przypadków), a drugi przykład wygląda tak ... Eh. +1 za kreatywność. – omninonsense

+0

ale czekaj, że return zwraca tylko z metody i nie łamie instrukcji case, prawda? –

3

Oto odpowiedź podobna do techniki WarHog dał:

case x 
when y 
    begin 
     <code here> 
     break if something 
     <more code> 
    end while false 
end 

lub jeśli wolisz:

case x 
when y 
    1.times do 
     <code here> 
     break if something 
     <more code> 
    end 
end 
Powiązane problemy