7

loop { break }うまく動作しますが、

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

で可能breakですblock variableか?

アップデート:

詳細を説明する例:

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ブロックから機能することができます)が、ループを壊せない理由がわかりません。

PS 下手な英語でごめんなさい >~<

4

2 に答える 2

3

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

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

puts foo     # => 'hello' , without 1
于 2013-03-15T10:14:28.737 に答える