2011-11-05 21 views
13

Quindi, ho provato break, next e return. Tutti danno errori, exit ovviamente funziona, ma quello completamente uscite. Quindi, come si finirebbe uno case...when "troppo presto?"Come "interrompere" un caso ... mentre in Ruby

Esempio:

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

(Quanto sopra è una qualche forma di pseudo-codice solo per dare l'idea generale di cosa sto chiedendo [inizio ... fine è stato utilizzato con la speranza che break avrebbe funzionato .?]

E, mentre io sono a esso, c'è un altro elegante modo di passare blocchi per case...when

+0

basta ristrutturare la logica - vedi sotto – Tilo

risposta

7

cosa c'è di male:

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

Nota che if !something è lo stesso di unless something

+0

Assolutamente nulla! Mi è passato per la mente, ma stavo cercando il modo giusto di farlo. Supponevo che ci fosse un modo giusto, a parte questo. Quindi, se non c'è altro modo di farlo, immagino che questo sia il modo giusto. Grazie! : D – omninonsense

+0

Il problema è indentato. Se non fosse sbagliato, allora la lingua non avrebbe bisogno nè 'break' nè' next'. – Nakilon

4

vedo un paio di possibili soluzioni. Alla prima mano, si può definire il blocco di istruzioni all'interno di un metodo:

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

case x 
    when y 
    test_method 
end 

Al altra parte, è possibile utilizzare catch-throw, ma credo che sia più brutto e il modo non-rubino :)

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

Beh, se avessi creato un metodo per ogni caso sembrerebbe strano, davvero strano (e ci sono molti casi) e il secondo esempio _sembra_ un po '... Eh. +1 per la creatività, però. – omninonsense

+0

ma aspetta, che restituisce solo restituisce dal metodo e non infrange la dichiarazione del caso, giusto? –

3

Ecco una risposta simile alla tecnica WarHog dato:

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

o se si preferisce:

case x 
when y 
    1.times do 
     <code here> 
     break if something 
     <more code> 
    end 
end 
Problemi correlati