From: take_tk Date: 2004-04-16T11:40:12+09:00 Subject: [ruby-list:39567] 同名クラスの上書きについて たけ(tk)です http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%A5%AF%A5%E9%A5%B9%A1%BF%A5%E1%A5%BD%A5%C3%A5%C9%A4%CE%C4%EA%B5%C1 > クラスが既に定義されているとき、さらに同じクラス名でクラス定義を書くとク > ラスの定義の追加になります。ただし、 元のクラスと異なるスーパークラスを > 明示的に指定して定義すると、元のクラスとは異なる新たなクラスを同名で定 > 義することになります(このとき、クラス名の定数を上書きすることになるので > 警告メッセージが出ます)。 という仕様についてなのですが、新たなクラスを同名で定義しようとしたときに、 「already initialized constant Foo」という有り触れた警告ではなく、もっと 強い警告を出すか、またはできれば例外を生成してくれないでしょうか? * Windows版では「already initialized constant Foo」は極めて有り触れた もの。require "Foo" と require "foo" のように大文字小文字を気にしないで requireしてしまうと出てくる。unix系でもディレクトリ付き/ディレクトリな しでrequireが重複すると同じでしょう。その場合には、通常は、無視しても問 題がない。よって、デバッグが後回しになる。 これで填まったのは2回目です。発生状況は別々。 (1)既存のクラスがあるのを忘れて同名のクラスを作ってしまったとき。 (2)クラスの基本定義部分のスクリプト(親あり)と拡張部分のスクリプト (親なし)を分けていたところ、誤ってrequireの順番を入れ換えて拡張用のス クリプトを先にrequireしてしまったとき。 ---- #(1) class Foo Bar = 1 end class Foo < String Baz = 2 end p Foo.constants #=> ["Baz"] p RUBY_VERSION #=> "1.8.1" ---- 問題状況としてはmodule→classの場合と同じなので、できれば例外生成が良い と思います。「class Foo has different parent(TypeError)」くらい。 ---- #(2) module Foo Bar = 1 end class Foo < String #=> Foo is not a class (TypeError) Baz = 2 end ---- Take_tk = KUMAGAI Hidetake たけ(tk)=熊谷秀武