requireメソッドとは
Rubyのライブラリ(.rb
, .so
, .o
, .dll
など)を読み込むメソッド
require(feature)
#=> boolean
読み込みが成功すると、true
。失敗すると、false
を返します。
feature
:ファイル名の文字列を絶対パスあるいは相対パスで指定します。
絶対パス
絶対パスは階層構造の頂点(ルートディレクトリ)からの位置関係を記述する方式です。
ルートディレクトリから目的のディレクトリまでの道筋を省略なく記述します。
下記のようなディレクトリがあったとします。
main.rb
からsub.rb
を読み込む場合、

# 絶対パスの場合
require '/Users/ユーザー名/ruby/sub/sub' # .rbは省略できます
相対パス
現在いるファイルの位置(カレントディレクトリ)から外部ファイルの位置を記述します。
先ほどと同じ例で、main.rb
からsub.rb
を読み込む場合、

# 相対パスの場合
require File.expand_path('sub/sub', File.dirname(__FILE__))
注:カレントディレクトリ(File.dirname(__FILE__))を記載しないと外部ファイルを読み込めません。
よくある間違った書き方
カレントディレクトリを .
で指定している。
# 相対パス
require './sub/sub'
注:このパスの指定方法は、そのファイルからの相対パスではなく、ruby
コマンドを実行したディレクトリからの相対パスという意味になってしまうため、実行するディレクトリによって動作が変わってしまいます。
rubyディレクトリから実行するとsub.rbを読み込めるが

一つ上のディレクトリで読み込んでみると、ロードエラーが起きる

なので、相対パスを指定するときは、require_relative
メソッドを使用しましょう
require_relativeメソッド
require_relativeメソッドとは
現在のファイルからの相対パスで読み込みます。
require_relative('sub/sub')
先ほど紹介した相対パスの書き方とほぼ同じ動作をします。
# require_relative('sub/sub') と一緒
require File.expand_path('sub/sub', File.dirname(__FILE__))
Kernel.#require_relative (Ruby 3.2 リファレンスマニュアル)
require File.expand_path(relative_feature, File.dirname(__FILE__))
とほぼ同じです。
まとめ
require
メソッドで相対パスを指定するときに、ハマったので使い方をまとめてみました。
相対パスはrequire_relative
メソッドを使用しましょう。
コメント