まつもと ゆきひろです

In message "[ruby-dev:22796] Re: relative load/require (Re:  Re: $: trick in test/*)"
    on 04/01/31, Tanaka Akira <akr / m17n.org> writes:


|>   * 相対パスのロードは推奨されない
|>   * 相対パスで読み込むのは.soファイルではない
|>
|> だろうからrequireに機能を追加しない方が良いだろうということ
|> です。
|
|えぇと、理由がわかりません。なぜ推奨されないのでしょう?

より正確には「requireに相対パスによるロード機能を追加するの
は」推奨されない、ですね。相対パスによるロードそのものに反対
しているわけではありません。

requireの特徴は

  * .soファイルをロードできる
  * 拡張子を省略できる
  * 二重ロードを避けることができる

です。現状、.soファイルと.rbファイルは違う場所に置くことになっ
ていますから、相対パスのロードでは.soファイルのロードは必要
なく、結果として拡張子の省略も必要ではありません(これを変え
るという話であればまた別に議論が必要ですが)。となると、便利
なのは二重ロードの禁止だけですね。

さて、ここでrequireに相対パスによるロード機能を追加するとな
ると、その優先順位はどうなるかという問題があります。現在の検
索方法は非常に単純です。$LOAD_PATHから要素を取ってきて、
feature名とくっつけ(場合によっては拡張子を補完して)、ファイ
ルがあればロードする、それだけです。

ここで相対パスを導入すると、どういうことになるのでしょうか。
$LOAD_PATHよりも優先すると場合によってはセキュリティ上問題に
なる可能性があります。では、一番最後でよいかというとそれでい
つも問題が解決するとは限りません。結局、「場合による」としか
言えないような気がします。

となると、__FILE__からの相対パスでロードしたい場合には、それ
用の専用のメソッドがあった方が良いという印象を持ちます。その
メソッドは、__FILE__からの相対でファイルを見つけ、二重ロード
の禁止のために、requireを呼びます。

これを実現するためにはフルパスでrequireされても混乱しないよ
うに$"をフルパスで正規化しておくのが望ましいと思います。

というのが、私の考えなのですが。

                                まつもと ゆきひろ /:|)