作者: HIDAKA Takahiro
日時: 2002/4/03(01:02)
 ひだかです。

kikwai@... (機械伯爵) wrote:

>  機械です。
> 
>  Pythonをライバル視してるのは・・・(Ruby教典P559参照)

 言語間の比較とコミュニティの比較を同一視しなければよいのです。
まして、投稿数なんかで優劣が決まるわけでもないのだし。

> <Perl>
> >  でも、Rubyで入門するのと比較してメリットはないと思いますけど。
>  いや、Perlのほうが、気楽かな、と思って。
> 
> ※まじめな話、あまり壮大な言語だと、初心者が二の足を踏む場合があります。
>  まぁ、逆に大きい方が燃える冒険野郎もいますけど(ほぼ自爆)
>  ただし、私的には、Perlも巨大すぎる、という感想ですが・・・

 気付いているかどうか知りませんが、Perl はオブジェクト指向言語だと
指摘しておきます;)

>  ただルールが複雑かつ膨大で、「どこから手をつけて良い」のか、ほとほと
> 困って現在にいたっている、というのが現状です。
>  自分でも理解できないものを人に勧められない、というのが「初心者向け」
> リストからRubyを除いた最大の理由ですが、これから「理解するための別の
> 角度からのアプローチ」が現れれば、その評価は喜んでくつがえしたいと思い
> ます。

 機械さんにRubyが合わない理由は、ひとつにはルールから理解しようと
していることにあるとおもいます。

 たとえば、例に挙がっていた「プライベートメソッドはレシーバを省略
しなければならない」「print は Kernel モジュールのプライベートメソッド」
という2点を考えると、とてもややこしいものにみえますが、
実際には、print メソッドは Kernel だけにあるわけじゃなくて、
IO の仲間には全部あるわけです。

 だから、「なにか」に出力したければレシーバを指定すればよいですし
(これが本来基本)、でも最もよく使われる(とされる)標準出力では
省略できるようになっている、というだけのことです。逆に、
self.print というようなレシーバは意味不明なので、書く必要が
ありません。

 言い換えると、ルールは複雑に見えますが、ライブラリのAPIセットが
考えて作られているので、あまり気にしなくても「よきにはからって」
くれるようになっています。

 ここでは、self.print の実体は Kernel モジュールにある
プライベートメソッドで、Object は全て Kernel モジュールを
include していて、Kernel.print は $defout.print メソッドを
呼び出し、$defout はデフォルトでは STDOUT を指しているからこそ、
標準出力に出力されるわけですが、それを全く知らなくても、

・IO#print が書ける
・print は単独でも書ける

ということを知っていれば使えるところにRuby の工夫があると思います。

 でもこのことは、よく工夫されているところでもありますが、
ライブラリのできがよくないと活きてこないですし、ということは
気軽にライブラリを作ろうとしても、ある程度のパターンを知っていないと
上手く作れない、という欠点でもあります。

 既存のライブラリにはそのようなパターンを含むものが多くありますから、
ソースを読んだだけではそのパターンに気付けなくて意図が読めない、
といったことはあるかもしれないとは感じます。全部の本を熟読した
わけでもないのですが、このようなRuby特有のパターンの解説がすくなかったり、
言語的に支援していないことがとっつきにくさのひとつの原因なのかな、
とは思いました。

-- 
ひだかたかひろ  cv8t-hdk@...-net.or.jp