Hatena::ブログ(Diary)

gama子log RSSフィード

2008-05-28

[]require "../"は$LOAD_PATHをサーチしない

昨日のつづき。

$LOAD_PATH << File.dirname(__FILE__)
require "child/../../parent.rb" # これはできるのに
require "../parent.rb"          # これはできない

はなぜできないのか。いや、カレントディレクトリからの親ディレクトリはロードできるんだけど、スクリプト自体のファイルパスからの親は指定できないのはなぜか。


ruby-listメーリングリストのこのあたりをよんでいて気がついたんだけど、おそらく"../"や、"./"から始まるパスは、あくまでカレントディレクトリからのパスとして認識して、$LOAD_PATHにあるパスをサーチしないのではないだろうか。


つまり、requireで受けとるパスには

  • 絶対パス
  • ../や./で始まる実行時のカレントディレクトリを基準とした相対パス
  • $LOAD_PATH配列からサーチする相対パス

の3種類を指定できるっぽい。(ちゃんと確認しろよ)


ただ、基本的には、実行時にちゃんとライブラリの場所を意識せずに使うってのはruby的にありえない(ような気がする)ので、-Iオプションで指定するなりして、実行者が$LOAD_PATHに加えて実行というのが正統派なような。


というあたりは常識だからリファレンスに書いていないのかな??