ブロックの break ステートメント ( The Ruby Programming Languageによる) は次のように定義されます。
これにより、ブロックがその反復子に戻り、反復子がそれを呼び出したメソッドに戻ります。
したがって、次のコードを実行すると、LocalJumpError が発生します。
def test
puts "entering test method"
proc = Proc.new { puts "entering proc"; break }
proc.call # LocalJumpError: iterator has already returned
puts "exiting test method"
end
test
次のコードはLocalJumpError をスローしません。アンパサンド記号の特徴は何ですか? アンパサンド記号は暗黙的に Proc.new を使用していませんか?
def iterator(&proc)
puts "entering iterator"
proc.call # invoke the proc
puts "exiting iterator" # Never executed if the proc breaks
end
def test
iterator { puts "entering proc"; break }
end
test
つまり、Proc.new 呼び出しをインライン化する手段としてアンパサンド記号を読み取ります。その時点で、動作は最初のコード スニペットとまったく同じになります。
def iterator (p = Proc.new { puts "entering proc"; break})
...
end
免責事項: 私は言語 (ruby 1.9.2) を学習したばかりなので、参照と詳細な概要を高く評価します。