クラスはよくてもモジュールは?

いままで気にしたことなんて無かったけど……

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

意外に少ない。