WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Rubyでの外部ファイルの読み込み

   

requireによる外部ファイルの読み込み

requireでは組み込み変数である$LOAD_PATHに登録されているディレクトリからファイルを探していく。

require 'foo'  # 拡張子は省略することができる

Rubyバージョンによる$LOAD_PATHの扱いの違い

ただし、Ruby1.9.2以降とそれ未満のバージョンとでは、$LOAD_PATHの扱いに違いがある。

Ruby1.9.2未満では$LOAD_PATHにカレントディレクトリ(Rubyを実行中のディレクトリ)が含まれる。

$ rbenv shell 1.8.7-p375
$ ruby -e 'puts $LOAD_PATH'  カレントディレクトリが出力にある

Ruby1.9.2以降では、$LOAD_PATHにカレントディレクトリが含まれない。

$ rbenv shell 2.2.1
$ ruby -e 'puts $LOAD_PATH'  カレントディレクトリが出力にある

ただし、`require ‘./foo’`のように先頭が./や../ではじまるパスを指定した場合はカレントディレクトリからファイルを検索するという振る舞いとなる。

require_relative

下記のようにrequire_relativeで読み込むと、そのファイルからの相対パスで読み込む。

require_relative 'foo'

例えばhoge.rbと同じfoo.rbが同じディレクトリにあって、hoge.rbに`require ./foo`と書くとする。
すると、hoge.rbが設置してあるディレクトリでhoge.rbを実行する場合はfoo.rbがうまく読み込まれるが、別のディレクトリからhoge.rbを実行するとそのディレクトリからの相対でfooを読み込もうとするのでうまくいかなくなる。

require_relativeを使えばそのようなことはなくなる。

Ruby1.9.2以降では$LOAD_PATHに含まれるファイルを読み込む場合はrequire、$LOAD_PATHに含まれないファイルを読み込む場合はrequire_relativeを使ったほうがいい。

 - Ruby , , , ,