作者: HIDAKA Takahiro
日時: 2002/4/06(12:24)
 ひだかです。TSruby です。

Noritsugu Nakamura <nnakamur@...> wrote:

> 中村 のりつぐ です。
> 
> >  この例は module に class を追加する例ですよね。
> はい。
> 私は、「class にメソッドを追加できないとRuby ユーザは
> 非常に困りそう」と勘違いしたのですが、というよりも
> 「module に class を追加できないと、非常に困る」と
> 感じていただけだなと気がついたわけです。

 名前空間の宣言があるモデルで、その名前空間にあとから
何も追加できないモデルの言語というのはあるんでしょうか。

 C++ は namespace でできますし、Java も package でできます。

> で、「module に class を追加する」Ruby 流は、
> ファイルで名前空間生成をしないので、
> ファイルがモジュールを生成する Python とは異なる。
> Python だったらどうするのかなと疑問を持ったわけで…
> # Python のモジュールも生成するのは超簡単だけど
> # import とかの部分はいまいち理解できていない…

 Pythonは名前空間を宣言しないんですね。

 x.py と lib/x.py というファイルを読み込むとひとつの
名前空間になるか2つの名前空間になるかどちらでしょうか?

> > module にメソッドを追加する例も多いんでしょうかね。
> 単なる予想ですが、多くないと思います。
> 
> 似た機能を持ったものを集めたのが、module で、
> その module のメソッドを離れた場所に書く
> (ファイルを分けるなど)するメリットを
> 余り感じなさそうだから。
> (「module に class を追加する」のは例外でファイルを
> 分けて書きたいと思うらしい。<-- 編集のしやすさからか?)

 これが、名前空間的に使う場合と Mix-in 的に使う場合の
違いなのじゃないかなと推測しています。

 Mix-in はあまりあとから拡張したいという欲求がなさそうな
気はします。でも Enumerable の拡張とかもみたことあるような
気もするので、単に個人的欲求の問題かもしれません。

 名前空間への追加は、使い方にもよりますけどできないと
困ると思います。そうじゃないと、module Net みたいな
名前空間が使えなくなっちゃう。

> 同じ疑問かどうか分からないのですが?、Ruby の module
> の仕様に関して良く理解できていない点があります。
> 
> なぜ module_function :foo とわざわざ書かないと関数を
> 集約する機能(Math.sin とかの集合)として使えない
> 仕様になっているか?です。

 なるほど。。module のインスタンスメソッドには、Mix-in として、
include している側のクラスのインスタンスメソッドとして使うための
機能と、名前空間として、Math.sin のような関数的メソッドとして
使うための機能が混在しているから、かなぁ。

 module M
    def f
    end
  end
  
  # include M
  M.f           #=> エラー

ということですよね。include すれば、f でも M.f でも
使えるようになりますが。これは Mix-in として使うと思えば
普通の挙動に見えます。

 モジュールの特異メソッドにして、

 module M
    def M.f
    end
  end
  
  M.f           #=> エラーにならない

というのはできますね。include しても、f では呼べなくて
M.f では呼べます。これの使い道はなんだろう?

 あともうひとつの疑問は、名前空間でもあり、Mix-in としても
使うようなモジュールがあるかどうか、ですね。3秒考えても
思いつかないんですが、誰か思いついた方いたら教えてください。。

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