24年ぶりに道頓堀川から奇跡の生還を果たしたオッサンの人形ではない。

全てのクラスから参照できるメソッドを定義しているモジュールであり、Object クラスはこのモジュールをインクルードしている。

このKernelモジュールに定義されているメソッドこそ、以前概説した組み込み関数なのである。

もう終わっちゃった。

これではいくらなんでも寂しいので、ちょっとオマケとしてあるテストをしてみたいと思う。

Rubyのクラスは、暗黙的にObjectクラスを継承しているのである。その証拠に、Objectクラスのメソッドが呼び出せる。

001 | #Fooクラスの定義
002 | class Foo
003 | end
004 | 
005 | f=Foo.new
006 | puts "ボクはFooクラスのインスタンスです" if f.instance_of? Foo

つまらないサンプルだが、要するにメンバをなにも持たないFooクラスを定義して、インスタンスを生成すると、instance_of?という、Objectクラスが持つメソッドを使えるでしょうということが言いたいのだ。

ではここで、冒頭の説明を思い出していただきたいのだ。

『ObjectクラスはKernelモジュールをインクルードしている』

ということは、次のような記述ができるのではないだろうか?

001 | #Fooクラスの定義
002 | class Foo
003 | end
004 | 
005 | f=Foo.new
006 | f.puts "ボクはFooクラスのインスタンスです" ~
                           if f.instance_of? Foo

あれ?どこが変わったのか?そう、6行目のputsが、f.putsに変わったのだ。Objectクラスは、Kernelモジュールをインクルードしているわけであるから、Objectクラスから派生したFooクラスにも、Kernelモジュールに定義されているputsメソッドが存在するはずだと考えたわけである。

しかし、残念ながらこの呼び出しはエラーになる。

private method `puts' called for #<Foo:0x2840678> (NoMethodError)

どうやら私のようなひねくれプログラマーが妙な事をしないように、しっかり隠蔽されているようだ。

ま、できたところで全く無意味なのだけれども。

最終更新:2009年03月13日 22:55