From: "NAKAMURA, Hiroshi" Date: 2003-10-06T10:37:40+09:00 Subject: [ruby-dev:21508] eval BEGIN/END at runtime なひです。 runtime(ここでは初期のBEGIN群の実行が終わった後)に、 eval("BEGIN { p 1 }")とすると、その場で実行されます。 eval("END { p 1 }")のほうは、インタプリタ全体の終了時に、 規定の順序で実行されます。 def foo(n) eval("BEGIN { p 'begin: #{n}' }") eval("END { p 'end: #{n}' }") end BEGIN { p 'begin 0' } END { p 'end 0' } p "main 0" foo(1) p "main 1" foo(2) p "main 2" => "begin 0" "main 0" "begin: 1" "main 1" "begin: 2" "main 2" "end: 2" "end: 1" "end 0" これは仕様ということでよいでしょうか。あるいは不定? 1. 仕様。 2. evalのBEGINは、そのevalブロックの中でのBEGINであるのでOK。 evalのENDを、BEGINに揃えて、そのevalブロックの中でのENDにする。 "begin 0" "main 0" "begin: 1" "end: 1" "main 1" "begin: 2" "end: 2" "main 2" "end 0" になる。 3. evalでENDを定義することに問題はない。使ってる人も居るかも。 揃えるなら、evalのBEGINもインタプリタでのBEGINと解釈する。 が、すでに間に合わないのでなにか間違っているはずで、例外を上げる。