1
0

Rubyにおけるrequire、require_relative、loadの違いと使い方

Last updated at Posted at 2024-06-20

はじめに

Rubyでプログラミングを行う際、ファイル間でコードを共有し再利用することは非常に重要です。これを実現するための主要なキーワードは requirerequire_relative、および load です。しかし、多くの初心者プログラマーはそれらの違いに混乱することがあります。この記事では、requirerequire_relativeload について詳しく説明し、それらを効率的に使用する方法を具体的な例を交えて紹介します。

この記事では、以下のようなディレクトリとファイル構成を仮定します:

- project/
  - main.rb
  - lib/
    - foo.rb
lib/foo.rb
class Foo
  def message
    puts "Hello world!"
  end
end

Rubyにおけるrequire

require は、ライブラリやモジュールを現在のプログラムにロードするために使用されるRubyのキーワードです。require の特徴は、プログラムの実行中に一度だけファイルをロードすることです。これにより、不要な再ロードを避け、システムリソースを節約できます。

require は指定されたファイルを読み込み、メモリに保存します。次回以降、そのファイルにアクセスする際には、メモリに保存された内容を使用するため、再度ファイルを読み込む必要がなくなり、パフォーマンスが向上します。しかし、require されたファイルに後で変更が加えられた場合、その変更は反映されません。

require を使用する際、Rubyはグローバル変数 $LOAD_PATH にリストされているパスでファイルを検索します。ファイル名の指定時に .rb 拡張子を省略することができます。

requireの例

次のような内容の main.rb ファイルがあるとします:

project/main.rb
require './lib/foo'

foo = Foo.new
foo.message

この main.rb を実行すると、次のような結果が得られます:

Hello world!

Rubyにおけるrequire_relative

require_relativerequire と同様にファイルを一度だけロードしますが、現在のファイルの位置からの相対パスを使用してファイルをロードします。これにより、プロジェクト内のファイルをフルパスを指定せずにロードすることができ、便利です。

require_relativeの例

次のような内容の main.rb ファイルがあり、フォルダ project がフォルダ work 内にあるとします:

project/main.rb
require_relative './lib/foo'

foo = Foo.new
foo.message

プロジェクトのルートフォルダから main.rb を実行すると、期待通りの結果が得られます。

work/project/
# work/project/
ruby main.rb => Hello world!
work/
# work/
ruby project/main.rb => Hello world!

Rubyにおけるload

load は現在のプログラムにソースファイルをロードするために使用されるRubyのキーワードです。しかし、require とは異なり、load は呼び出されるたびにファイルを再ロードします。これは、実行中にファイルの内容が変更された場合、その変更が反映されることを意味します。

loadの例

次のような内容の main.rb ファイルがあるとします:

project/main.rb
load './lib/foo.rb'

foo = Foo.new
foo.message

この main.rb を実行すると、結果が表示されます。

requireとloadの比較

これらのキーワードはすべて、現在のファイルに必要なコードをロードするために使用されます。基本的な違いは次のとおりです:

  • require はプログラムの実行中に一度だけファイルを読み込みます。
  • load はファイルが呼び出されるたびにそのファイルを再読み込みします。

そのため、load は開発環境(development)での作業に役立ちます。この環境では、ソースコードの変更が頻繁に発生します。逆に、require は、ソースコードが安定していて頻繁に変更されない本番環境(production)での使用に適しています。

まとめ

以下は、Rubyにおける requirerequire_relative、および load の違いを比較した表です:

メソッド パス ロード回数 拡張子の省略
require Rubyの実行パス($LOAD_PATH)からの相対パス 一度だけ
require_relative require_relative が呼び出された位置からの相対パス 一度だけ
load Rubyの実行パス($LOAD_PATH)からの相対パス 呼び出されるたびに再ロード 不可

これらの違いを明確に理解することで、requirerequire_relative、および load を効果的に使用し、Rubyプロジェクトをより効率的に管理することができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0