loadとrequireの違い
loadもrequireと同じく別ファイルにあるRubyコードを読み込む機能を持ちますが、以下の様な違いがあります。
- requireは与えられたファイル名に「.rb」「.so」を自動付与して検索するが、loadはしない
- requireは一度読み込んだファイルを再度読み込もうとするとスキップするが、loadは何度でも読む
簡単な例を示します。
load.rb
というファイルからloaded.rb
をロードするとします。次のようにrequireを使った場合は、二度目の呼び出しでfalseが返ってスキップされます。
しかしloadを使うと、loaded.rb
ファイルが二度評価され、定数XYZ
が二度初期化されているという警告が表示されます。
コードを修正しながらirb(もしくはpry)などのREPL中から何度も読みなおして動作テストをするケースなどでは、loadの方が使い勝手が良いことがあります。
autoload
最後にautoloadです。利用ケースの一例としては、レスポンスが重視される巨大なアプリケーションが挙げられます。巨大なアプリケーションでは、初期化時にすべてをロードするのではなく必要になった時に読み込むという遅延ロードを活用したほうがパフォーマンスがよくなることがあります。autoloadはこのようなときに利用される機能です。
Rubyリファレンスにわかりやすい説明があるので引用します。
autoloadメソッドを使うと、ネストされたクラスやモジュールが必要になったときにRubyファイルを自動的に読み込む(requireする)ことができます。引数nameには定数名(クラス・モジュール名)をシンボルか文字列で指定し、引数file_nameにはファイル名を指定します。戻り値はnilです。
以下、使い方を示します。
次のようなShell::Core
クラスを想定します。このファイルが読まれた時に1行目に書いてある「puts 'loading core.rb'
」が出力されるようにしています。
これを、Shellクラスからautoloadしてみます。
autoloadを呼んだ時点ではloading core.rb
と出力されず、実際にShell::Core
インスタンスが必要とされた時にはじめてロードされていることがわかります。
まとめ
以上、一見わかりづらい読み込み系メソッドの違いを簡単に見てきました。最も原始的なのがload、二重読み込み防止などで使い勝手がよく使われるのがrequire、相対パスで簡単にrequireできるようにしたのがrequire_relative
、そしてautoloadはクラス・モジュールの遅延ロードを実現するものでした。