From: Tanaka Akira Date: 2004-02-04T01:45:16+09:00 Subject: [ruby-dev:22804] Re: relative load/require (Re: Re: $: trick in test/*) In article <1075556170.302988.22099.nullmailer@picachu.netlab.jp>, matz@ruby-lang.org (Yukihiro Matsumoto) writes: > より正確には「requireに相対パスによるロード機能を追加するの > は」推奨されない、ですね。相対パスによるロードそのものに反対 > しているわけではありません。 なるほど。 > requireの特徴は > > * .soファイルをロードできる > * 拡張子を省略できる > * 二重ロードを避けることができる > > です。現状、.soファイルと.rbファイルは違う場所に置くことになっ > ていますから、相対パスのロードでは.soファイルのロードは必要 > なく、結果として拡張子の省略も必要ではありません(これを変え > るという話であればまた別に議論が必要ですが)。となると、便利 > なのは二重ロードの禁止だけですね。 個人的には拡張ライブラリをあまり作らないのであまり考えていませんでした が、たしかにインストールする場所は 1.9/*.rb と 1.9/i686-linux/*.so と いうように違いますね。このレイアウトは extconf.rb を使った場合のソース の *.so と lib/*.rb というレイアウトとは異なるので相対パスで読み込めて もあまり嬉しくなさそうです。 これが拡張子の省略が必要ないという結果につながる理由は良く分からないの ですが、私としては相対パスを指定するのだと思えば拡張子も明示的に記述す るのは悪くないと思うようになって来ました。 > さて、ここでrequireに相対パスによるロード機能を追加するとな > ると、その優先順位はどうなるかという問題があります。現在の検 > 索方法は非常に単純です。$LOAD_PATHから要素を取ってきて、 > feature名とくっつけ(場合によっては拡張子を補完して)、ファイ > ルがあればロードする、それだけです。 > > ここで相対パスを導入すると、どういうことになるのでしょうか。 > $LOAD_PATHよりも優先すると場合によってはセキュリティ上問題に > なる可能性があります。では、一番最後でよいかというとそれでい > つも問題が解決するとは限りません。結局、「場合による」としか > 言えないような気がします。 プログラマの意図としては相対パスで読み込みたいのか feature 名で読み込 みたいのかはどちらかだと思うので、たしかに require が両方の機能を持っ ている場合、プログラマの意図とは異なるほうの解釈をしてしまった時には危 険かもしれませんね。 > となると、__FILE__からの相対パスでロードしたい場合には、それ > 用の専用のメソッドがあった方が良いという印象を持ちます。その > メソッドは、__FILE__からの相対でファイルを見つけ、二重ロード > の禁止のために、requireを呼びます。 なるほど。 > これを実現するためにはフルパスでrequireされても混乱しないよ > うに$"をフルパスで正規化しておくのが望ましいと思います。 > > というのが、私の考えなのですが。 だいたいわかりました。とくに反対するところはありません。 とすると、あと仕様で迷いそうな所は * シンボリックリンクされているファイル内で記述された相対パスの起点をシ ンボリックリンクの場所にするかファイルの実体があるところにするか * どんな名前にするか かな。 私は、前者についてはファイルの実体があるところからにするのがいいと思っ ています。これはファイル実体の位置をファイルを配置した人の意図だと考え て、シンボリックリンク経由で読み込んでもその意図に従うためです。そうす ると、site_ruby からライブラリの feature 名を実現するファイル (典型的 には xxx.rb, xxx/*.rb とあったときの xxx.rb) ひとつだけにシンボリック リンクを張れば使えるようになって、ディレクトリへのシンボリックリンクが いらないぶん一つ減って嬉しいですし。 名前の候補はいろいろ考えられます。 use import load_local load_lexical load_relative require_local require_lexical require_relative RequireRelative.require RequireRelative.require_relative とりあえず最初は説明的な(長い)名前にするのが常套手段ですが、何がいいで すかねぇ。 -- [田中 哲][たなか あきら][Tanaka Akira]