Rubyのロード機構について
Rubyはロード機構として、以下を備えています。
- require
- load
- autoload
- require_relative
require
requireは以下の特徴を備えています。
- ロードパスからファイルを探してくる
- 拡張ライブラリもロードできる
- 拡張子 .rb / .so を省略できる
- 同じファイルは2度以上ロードしない
Rubyのロードパスは $:
に入っています。
私の環境では以下のように表示されました。
1 | [1] pry(main)> puts $: |
load
loadもrequireと同じくロードパスからファイルを探してロードします。
しかし、requireのように拡張ライブラリはロードできません。
また、ロードできるファイルもRubyプログラムだけです。
requireのように2回以上の読み込みを制御する機構もなく、callされた回数分ファイルは読み込まれます。
autoload
autoloadはrequireと似ていますが、すぐには読み込まれず、必要になった段階でrequrieされます。以下、サンプルコードです。
autoload.rb
1 | autoload :Outer, './outer' |
outer.rb
1 | class Outer |
実行すると、Outerがloadされているのが確認できます。
1 | ⇒ ruby autoload.rb |
autoloadはネストされたクラスやモジュールもloadすることができます。
autoload.rb
1 | autoload :Outer, './outer' |
outer.rb
1 | class Outer |
inner.rb
1 | class Outer |
実行すると、Outer::Innerがloadされているのが確認できます。
1 | ⇒ ruby autoload.rb |
require_relative
あまり見かけることがありませんが、require_relative
というメソッドがRuby1.9.2から追加されています。
例えばrequire
で同じ階層のファイルをロードする場合は、require './filename'
のように明示的に./
を指定する必要があります。require_relative
を使えば、require_relative 'filename'
のように定義することができます。