From: matz@... (Yukihiro Matsumoto) Date: 2001-04-18T08:00:36+09:00 Subject: [ruby-dev:12999] Re: 仕様の確認 まつもと ゆきひろです In message "[ruby-dev:12994] 仕様の確認" on 01/04/18, Masato KIYAMA writes: |------------------------- |class Foo | class Array | def hoge | print "hoge\n" | end | end | def pri | Array.new(2, 3) #ここを(a)とする | end |end | |a = Foo.new |a.pri |------------------------- |結果:in `initialize': wrong # of arguments(2 for 0) (ArgumentError) | |さらに,(a)の部分が[3, 3].hogeだと,以下のようなエラーがでます. |結果:in `pri': undefined method `hoge' for [3, 3]:Array (NameError) | |しかし,(a)の部分がArray.new.hogeだと,以下のような結果になります. |結果: hoge | |意図してこのような結果になっているのでしょうか? できればなにを期待しているのかを明記してほしかったのですが、 これは意図した仕様です。 class Foo class Array end end では Foo::Array というクラスを新たに定義しています。Arrayの 再定義ではないことに注目してください。これで (1) Array.newはFoo::Array.newでありinitializeはデフォルト のままなので引数はとらない (2) []で生成されるArrayのインスタンスにはhogeは定義されない (3) Array.new.hogeはFoo::Array.new.hogeであり実行される という形で説明できると思います。 まつもと ゆきひろ /:|)