まつもと@ぴーえふゆーです。

matz / caelum.co.jp (Yukihiro Matsumoto) said:
> |あの、別スレッドで質問するべきなのかもしれないですが、
> |もうひとつ聞いていいですか?
> 
> どうぞ,どうぞ.

どうもありがとございます(_ _)

> まず,Kernelからしか継承していないクラスはnilだけなんですが,
> これは大した理由ではないです.nilは機能が少なくて別にObject
> である必要がないからです.

「Kernel」から継承していないじゃなくて、「Object」から継承して
いない、ですよね。

> 実はですね.主な理由は関数メソッドとの絡みなんです.
> 
> つまり,全ての関数的メソッド(openとか)はKernelのprivate
> methodとして定義してあります.そしてユーザがトップレベルでメ
> ソッドを定義するとObejctクラスにメソッドを定義します.
> 
> つまり,Kernelがなく関数メソッドをObjectのメソッドとすると,
> ユーザが同名のメソッドを定義すると「置き換えて」しまいますが,
> Kernelがあるので,「再定義」できます.つまり super で呼べる
> わけですね.

つまり、rubyをオブジェクト指向的にではなくて、手続き型言語として
使用することも出来るようにするために、ということですよね。もし仮
に、KernelをObjectのサブクラスとして

 ○ Object 
      |
      → ● Kernel 
                   open()
                   fork()
                   exec()
                   ……

こんな風に定義しちゃって、Kernelのメソッドをクラスメソッドにして
しまったとしたら、Kernel.open()とかって呼び出さなきゃいけなくて
手続き型言語っぽくなくなっちゃうからと。

ふむふむ。rubyが純粋なOOPLでもあり、かつ、おきらく極楽なscript
としても使える様にするためってことなんでしょうかねぇ。

なんとなくわかったような気になりました。ありがとうございました。

--
Eiji MATSUmoto  <ematsu / pfu.co.jp>
PFU Limited, Ishikawa Japan. < Call me 'USAGI' please. (^^) >