/ 最近 .rdf 追記 編集 設定 本棚

脳log[20050616] 日向まさみち 【本格推理委員会】 | Ruby(1.8.2)メモ: break, next, yield



2005年06月16日 (木)

[]日向まさみち 【本格推理委員会】

俺ってミステリ読みのスキルZEROなのな。

ヒントはあったのだよ。学年にたった一人の転校生とか、八重歯とか、八重歯とか、八重歯とか。

Ruby(1.8.2)メモ: break, next, yield

 メソッドに(ブロックとして)渡したProcオブジェクトで breakすると LocalJumpError。

[1].each{ break }

は無問題。

f = proc { break }
[1].each(&f)

in `each': break from proc-closure (LocalJumpError)

となる。差別だよ。撤廃撤廃。[ruby-dev:12070]。orz

状況によって Array#eachと Array#reverse_eachを使い分けたくて、でも処理内容は一緒だからブロックを使いまわそうとして、予め Procオブジェクトにしておいたら上記のエラーに遭遇した、と。

 nextはブロックを終わらせるが breakはブロックを呼び出したメソッドを終わらせる。

def hoge(&block)
  puts 'hoge start'
  yield
  puts 'hoge end'
end
hoge { puts 'next'; next }
hoge { puts 'break'; break }

これ↑の実行結果はこう↓なる。

hoge start
next
hoge end
hoge start
break

ブロックで breakすると、hogeの yieldより後ろが実行されてない。

def hoge(&block)
  puts 'hoge start'
  begin
    yield
  ensure
    puts 'hoge end'
  end
end
hoge { puts 'next'; next }
hoge { puts 'break'; break }

こう↑すると勝手に実行をスキップされない。

hoge start
next
hoge end
hoge start
break
hoge end

yieldの呼び出しには注意が必要だったのだな。

 ブロックの中でうっかり returnを使ってしまって LocalJumpErrorを食らった時は代わりに nextを使う。(ruby1.7以降)

そういうことです。補足はありません。