From: Yukihiro Matsumoto Date: 2008-12-16T00:08:18+09:00 Subject: [ruby-dev:37451] Re: [BUG:trunk] Array#push with no argument on a frozen array まつもと ゆきひろです In message "Re: [ruby-dev:37440] [BUG:trunk] Array#push with no argument on a frozen array" on Mon, 15 Dec 2008 10:56:58 +0900, "Yugui (Yuki Sonoda)" writes: |Freezeされた配列から0個popしようとするとArgumentErrorが発生します。 |(1.8.7ではTypeError) え、RuntimeErrorではなくて? 1.9ではfreezeされたオブジェクト の操作でTypeErrorではなくRuntimeErrorが出ます。これは1.9での 仕様変更。 |[1, 2].freeze.pop(0) #=> ArgumentError | |一方Freezeされた配列に0個pushしようとすると何も起きません。 | |[1, 2].freeze.push() | |これは意図されたことでしょうか? 単にエラーチェックの順番の問題ですねえ。popではfreezeチェッ ク(rb_ary_modify)が先に来ているのでエラーになり、pushでは引 数の数のチェックが先なのでエラーになる前にnopであることを判 別できているわけです。 境界ケースだと思うのでどっちでも良いと思うのですが、揃えた方 が誤解は少ないでしょうね。どっちが良いと思います? まつもと ゆきひろ /:|)