2013-03-15 14 views
6

loop { break }が正常に動作することができますが、閉包(Proc、lambda)で外ループを `中断する '方法は?

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

block variablebreakにそれは可能ですか?

更新:

の例では、より多くを説明するために:私の理解として

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) 

Proc.newをブロックと同じ動作するはずです(それはreturnブロックから関数ができる)が、私は理由を理解していませんループを壊すことはできません。

P.S.私の悪い英語のために申し訳ありません>〜<

+0

これで何を達成したいですか? –

+0

99%が関連しています:http://stackoverflow.com/questions/626/when-to-use-lambda-when-to-use-proc-new – tokland

+0

@Sergio更新を見る、@tokland 'Proc。 'new'と' lambda'の間に 'closure'で' break'を尋ねています –

答えて

3

ブロックから戻るには、nextキーワードを使用できます。

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

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

'break'外部ループがブロックと異なるreturn –

+2

あなたの場合、' lambda'を使用して 'return'を使うことができます。' next 'これはうまくいかない(それはうまくいく) –

3

あなたはこれが私のために

raise StopIteration 

働いていた可能性があり、この問題を解決するために。

関連する問題