今回はRubyにおける「requireメソッド」と「require_relativeメソッド」の違いについて解説したいと思います。モジュールや外部ファイルの読み込みがうまくいかない場合は「require_relativeメソッド」を使用することで解決できることがあるのでぜひ理解しておきましょう。
requireメソッドとは
requireメソッドとは、外部ファイルやライブラリ、モジュールといった別ファイルで管理されているものを読み込むことができるメソッドです。
詳しくはこちらの記事にまとめてあるので、理解が曖昧な方は参考にどうぞ。

require_relativeメソッドとは
require_relativeメソッドはrequireメソッドと同じ役割で、外部ファイルやライブラリ、モジュールといった別ファイルで管理されているものを読み込むことができるメソッドです。
しかし使い方(記述方法)と読み込み方法に違いがあるため、次の項目でそれらについて見ていきましょう。
requireメソッドとrequire_relativeメソッドの違い
- カレントディレクトリを示す./を付けなければならない。
- カレントディレクトリからの相対パスを記載する。
- カレントディレクトリを示す./を付けなくて良い。
- 呼び出し元ファイルが存在するディレクトリからの相対パスを記載する。
それぞれについて詳しく見ていきましょう。
カレントディレクトリを示す./を付けるか付けないか
requireメソッドはカレントディレクトリを示す./が必要ですが、require_relativeメソッドでは./は必要ありません。
sample.rbとtest.rbという2つのファイルがあり、requireメソッドを用いてsample.rbがtest.rbを読み込む場合、以下のようなコードになります。
# sample.rb
require './test'
sample = Sample.new
sample.test
# test.rb
class Sample
def test
puts '読み込みOK!'
end
end
ではこれらをrequire_relativeメソッドに置き換えてみましょう。
# sample.rb
require_relative 'test'
sample = Sample.new
sample.test
# test.rb
class Sample
def test
puts '読み込みOK!'
end
end
このようにrequire_relativeメソッドにすることで、わざわざカレントディレクトリを示す./を付けなくて済むようになります。
相対パスの記載方法
requireメソッドとrequire_relativeメソッドの違いはもう1つあり、それが相対パスの記載方法になります。
requireメソッドはカレントディレクトリからの相対パスを記載する一方で、require_relativeメソッドは呼び出し元ファイルが存在するディレクトリからの相対パスを記載しなければなりません。
詳しく見ていきましょう。
以下のような階層構造のディレクトリを作成しました。

同一ディレクトリにあるsample.rbとtest.rb同士の読み込みは、以下のようにrequireメソッドでもrequire_relativeメソッドでも実装が可能です。
# sample.rb
require './test' もしくは require_relative 'test'
sample = Sample.new
sample.test
# test.rb
class Sample
def test
puts '読み込みOK!'
end
end
では以下のように、hoge.rbがtest.rbを読み込む場合について見ていきましょう。

まずはrequireメソッドです。
requireメソッドは./を付け、カレントディレクトリからの相対パスを記載しなければなりませんでしたね。
# hoge.rb
require './lib/test'
sample = Sample.new
sample.test
# test.rb
class Sample
def test
puts '読み込みOK!'
end
end
続いてrequire_relativeメソッドです。
require_relativeメソッドは./を付ける必要がなく、呼び出し元ファイルが存在するディレクトリからの相対パスを記載しなければなりませんでした。
# hoge.rb
require_relative 'lib/test'
sample = Sample.new
sample.test
# test.rb
class Sample
def test
puts '読み込みOK!'
end
end
このようにrequireメソッドとrequire_relativeメソッドでは相対パスの記述方法が異なるため、注意しながら実装するようにしましょう。
まとめ
- requireメソッドは、カレントディレクトリを示す./を付けなければならない、カレントディレクトリからの相対パスを記載するといった特徴がある
- require_relativeメソッドはカレントディレクトリを示す./を付けなくて良い、呼び出し元ファイルが存在するディレクトリからの相対パスを記載するといった特徴がある
参考
module function Kernel.#require_relative
今回はRubyにおける「requireメソッド」と「require_relativeメソッド」の違いについて解説しました。requireメソッドによる外部ファイルの読み込みがうまくいかない場合は、require_relativeをぜひ使ってみましょう。