いままで気にしたことなんて無かったけど……
cf. Matzにっき – jijixi’s diary – Ruby の文法的欠陥
cf. じじぃの日記、ツッコミ可 – Ruby の文法的欠陥
jijixiさんのいう”欠陥”(というと言いすぎのような気もする,といっているけど)というのは
『新しいクラスを作ってるつもりで、知らないうちに既存のクラスを上書きする可能性がある』
で,これに対するまつもとさんの対策が
* ちゃんと名前空間を分離する
* クラスを定義する時にはスーパークラスを明示する
2つ目の方は,クラスを定義するときに指定したスーパークラスが合わないとエラーになるってことだな。
D:\>irb irb(main):001:0> class Foo; end => nil irb(main):002:0> class Bar; end => nil irb(main):003:0> class Baz < Foo; end => nil irb(main):004:0> class Baz < Bar; end TypeError: superclass mismatch for class Baz from (irb):4 from :0
そうは言っても class Foo < Object って書いてるのは見たこと無いけど。
さて,クラスはいいとしてもモジュールはどうだろう。
スーパークラスの明示みたいなものはないし,トップレベルで定義されたモジュールでは名前空間の分離もできない。
……ってことは,気をつけるしかないのか。
ちなみに,素の状態で定義されているモジュールは
D:\>type modules.rb ObjectSpace.each_object(Object){|o| puts o.name if o.class == Module} D:\>ruby modules.rb Marshal ObjectSpace GC Math Process::Sys Process::GID Process::UID Process Signal File::Constants FileTest Errno Precision Enumerable Comparable Kernel
意外に少ない。