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

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

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

意外に少ない。