新井です。

In message "[ruby-dev:21517] Re: eval BEGIN/END at runtime"
  on 06 Oct 2003 15:20:48 +0900,
  matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです

> 「RubyのENDは実行時に評価される」のがキーです。メソッド内に
> ENDがあるとそのメソッドが呼ばれた数だけEND procが登録されま
> す。それは多分意図とは違うでしょう。意図通りならat_exitを使
> えばよいことですし。

となると eval じゃない場合に許される理由はなんでしょう?

def foo
  END { p "foo" }
end

foo
foo

=> ruby 1.8.0 (2003-10-05) [i586-linux]
   "foo"

END の登録を1回きりにする保証が取れない場合にエラーにしたい
なら、以下をこそ禁止すべきな気もしますし。まだよくわかりませ
ん。
# 自分の首を絞めるのを止めてくれるのは ruby らしいのか、らし
# くないのか。

def foo
  eval 'END { p "foo" }'
end

foo
foo
=> ruby 1.8.0 (2003-10-05) [i586-linux]
   "foo"
   "foo"

さらに言うと END の登録を実行時にした理由も知りたい気がしま
すが、教えて君が過ぎますでしょうか?(^^;
# 休みを取るとうるさくて困りますね。私てば(汗

> |ネストした END が最後に回されるのも仕様でしょうか?
> |なんとなく、35421 を期待したのですがそうじゃないとしても
> |別に困りませんが。
> 
> これも「実行時」の結果です。仕様だと思ってください。
> 

仕様と言われれば反対する理由はありませんので、気持良く納得です。

--
新井康司 (Koji Arai)