ひだかです。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