2013-03-15 19 views
6

loop { break } kann gut funktionieren, aberWie man eine äußere Schleife in Schließung "bricht" (Proc, Lambda)?

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

Ist es möglich, break in einem block variable?

Update:

Ein Beispiel mehr erklären:

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) 

Als mein Verständnis, Proc.new sollte als Block gleiche Arbeit (es kann return eine Funktion von Block), aber ich verstehe nicht, warum kann eine Schleife nicht brechen.

P.S. Entschuldigung für mein schlechtes Englisch> ~ <

+0

Was möchten Sie damit erreichen? –

+0

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

+0

@Sergio Siehe Update, @tokland Ich kenne die verschiedenen in 'Proc. new' und 'lambda', ich frage' break' in 'closure' –

Antwort

3

Um von einem Block zurückzukehren, können Sie das Schlüsselwort next verwenden.

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

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

' break' eine äußere Schleife ist eine andere Rückkehr vom Block –

+2

In Ihrem Fall können Sie 'lambda' verwenden und' return' verwenden, denke ich 'next 'ist nicht gut dafür (obwohl es funktioniert) –

3

Um dieses Problem zu lösen, könnten Sie

raise StopIteration 

dies für mich gearbeitet.

Verwandte Themen