2013-03-15 8 views
6

loop { break } può funzionare benissimo, maCome rompere un ciclo esterno in chiusura (Proc, lambda)?

block = Proc.new { break } 
# or 
# block = lambda { break } 
loop(&block) # => LocalJumpError: break from proc-closure 

E 'possibile break in un block variable?

Aggiornamento:

Un esempio per spiegare di più:

def odd_loop 
    i = 1 
    loop do 
     yield i 
     i += 2 
    end 
end 

def even_loop 
    i = 2 
    loop do 
     yield i 
     i += 2 
    end 
end 

# This work 
odd_loop do |i| 
    puts i 
    break if i > 10 
end 

# This doesn't work 
break_greater_10 = Proc.new do |i| 
    puts i 
    break if i > 10 
end 

odd_loop(&break_greater_10) # break from proc-closure (LocalJumpError) 
even_loop(&break_greater_10) # break from proc-closure (LocalJumpError) 

Come la mia comprensione, Proc.new dovrebbe funzionare stesso blocco (si può return una funzione dal blocco), ma non capisco il motivo per cui non può rompere un ciclo.

P.S. Scusa per il mio cattivo inglese> ~ <

+0

Cosa vuoi ottenere con questo? –

+0

99% correlato: http://stackoverflow.com/questions/626/when-to-use-lambda-when-to-use-proc-new – tokland

+0

@Sergio Vedi aggiornamento, @tokland conosco il diverso in 'Proc. nuovo 'e' lambda', sto chiedendo 'break' in' closure' –

risposta

3

Per tornare da un blocco è possibile utilizzare la parola chiave next.

def foo 
    f = Proc.new {next ; p 1} 
    f.call 
    return 'hello' 
end 

puts foo  # => 'hello' , without 1 
+0

'break' un ciclo esterno è diverso dal blocco –

+2

Nel tuo caso, puoi usare' lambda' e usare 'return', penso' next 'non va bene per questo (anche se funziona) –

3

Per risolvere questo problema si potrebbe

raise StopIteration 

questo ha funzionato per me.

Problemi correlati