(The Ruby Programming Languageあたりなど)のブロックのbreak文が定義されていますProc.new v。アンパサンド記号を使用すると、rubyのbreak文の動作が異なるのはなぜですか?次のように
は、そのイテレータ、それを呼び出したメソッドに戻りイテレータに戻るには、ブロックの原因となります。
したがって、次のコードを実行すると、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
免責事項:私は初心者くさい(ルビー1.9.2)の言語を勉強していますので、参照して、詳細な概要を理解するだろう。
適切な答えはありませんが、これはすべて範囲に関するもので、ProcやLambdaは特別なものではありません。 – coreyward
あなたが時間を得るとき...この質問に再度訪問してください。あなたの洞察に感謝します –
'Proc.new'の代わりに' lambda'を試してみてください。 – Casper