あおきです。

  In mail "[ruby-ext:01595] Re: require 'dir/...'?"
    matz / zetabits.com (Yukihiro Matsumoto) wrote:

> まつもと ゆきひろです

> require 'foo/' なり require 'foo/*' なりが有効なのは、ユーザ
> に見せたいものを定義しているファイル群とライブラリを構成して
> いるファイル群が一致している場合だけで、それは一般的なことで
> はないですよね。

とりあえず前提として、ぼくが推すのは require 'foo' で
foo.rb → foo.so → foo/* のロードです。そのうえで、

> あおきさんは、一致するのが当然と思っているようで(違う?)、大

そうです。もうちょっと言うと、「デフォルトとしては当然」です。
例えば

  In mail "[ruby-ext:01589] Re: require 'dir/...'?"
    Kenichi Komiya <kom / mail1.accsnet.ne.jp> wrote:

> 小宮です。

> 私だけかもしれませんが、始めひとつのファイルで十分だった foo.rb が
> いつの間にか膨張して foo/ を作って分割ということがわりとあるので。
> そういう場合にもエントリーポイントを変えずに済むというのがa案(
> 「foo.rb foo/方式」)の利点のひとつだと思います。

というような場合(よくありそうだと思われる)には一致するでしょう。もとも
と論理的にまとまりがあるファイル群をディレクトリにまとめちゃおう、とい
うのが発端だったわけですから、その逆に、同じディレクトリに入ってるもの
はまとまりのあるものだ、と(デフォルトで)みなしても問題は少ないと思うん
です。

デフォルトと違う場合はどうするかというと、webrick 方式(と仮に呼びます)
に webrick.rb を明示的に作って制限すればいい。つまりまとめるとライブラ
リのロードパターンには以下のようなものがありそうです。

  1 ひとつのディレクトリに入ってるものはすべてライブラリの
    (基本?)構成要素だ (tmail 型)

  2 ディレクトリの中にあるファイルがまとまりごとに完全に分離して
    使える (それぞれロードしてもらうべきだ)  (net 型)

  3 ディレクトリの中にはコアと周辺部分があり、明示指定なしの
    require 'libname' のようなロードではコアだけをロードする。(webrick 型?)

んで、3. の場合 libname.rb を明示的に作ってやればいい。それはどういう
方式になっても自分で作らなければいけないわけだからrequire 'foo' がデフォ
ルトで foo/* を意味したからといって問題にはならない (foo.rb が存在する
わけだからそっちが優先)。

一方 2. は、全部ロードされたら困る場合と困らない場合がある。困る
のはどういう場合かというと、(jcode.rb みたく)ロードされたら動作が
変わってしまうものがある場合です。

ではそれはどのくらいで確率で起きるかというと、条件と
しては

  1  ユーザが、全部ロードしるべきでないライブラリを省略して
     require 'foo' でロードしてしまう
  2  ライブラリが、ロードによって動作を変えるファイルを含む
  3  トップレベルの foo.rb を書いてない

のすべてが満たされた時です。ここで、まつもとさんがおっしゃってるのは

  1. がもし成立したとしても暗黙のままに続けるべきではない

ということですよね。それでぼくが言ってるのは

  1. が成立する確率はそうとう低いと思う。ドキュメント(サンプル)に
  require 'net/http' って書いてあるのに require 'net' するやつは
  いない

です。1. をうっかりやっちゃう人はおそらく初心者と想定されますが、
それならさらにドキュメントに従う率が高いと考えられる。しかも、
それをやったとしても困るのはライブラリの側もタイプ 2 で、かつ
ロードで動作の変わるライブラリを含むときだけですよね。それだっ
たらさらに確率は減ります。

その少ない確率でも絶対ダメ、とおっしゃるなら(たぶんそうなんだろう)
負けは確実なんですけどね……はあ……やっぱ負けかあ。
-------------------------------------------------------------------
青木峰郎