Ruby

【Ruby】requireとrequire_relativeの違いについて簡単にまとめてみた

Ruby

 

今回はRubyにおける「requireメソッド」と「require_relativeメソッド」の違いについて解説したいと思います。モジュールや外部ファイルの読み込みがうまくいかない場合は「require_relativeメソッド」を使用することで解決できることがあるのでぜひ理解しておきましょう。

requireメソッドとは

requireメソッドとは、外部ファイルやライブラリ、モジュールといった別ファイルで管理されているものを読み込むことができるメソッドです。

詳しくはこちらの記事にまとめてあるので、理解が曖昧な方は参考にどうぞ。

Ruby
【初心者向け】Rubyで外部ファイルを読み込むことができるrequireメソッドについて解説Rubyで外部ファイルやライブラリを読み込むことができる「requireメソッド」について解説しています。保守性が高いコードや可読性を高める上では必須の知識になるので、ぜひ使いこなせるようにしておきましょう。...

require_relativeメソッドとは

require_relativeメソッドはrequireメソッドと同じ役割で、外部ファイルやライブラリ、モジュールといった別ファイルで管理されているものを読み込むことができるメソッドです。

しかし使い方(記述方法)と読み込み方法に違いがあるため、次の項目でそれらについて見ていきましょう。

requireメソッドとrequire_relativeメソッドの違い

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を読み込む場合について見ていきましょう。

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をぜひ使ってみましょう。