昨日に引き続きRubyのreuiqreに関する話題である。
requireは実行された時に参照先を即座に読み込んでしまう。そのためrequireする対象が非常に大規模な場合、requireにかかる時間やリソースが問題になる場合がある。そのような場合はautoloadが助けになるかも知れない。
autoloadはクラスやモジュールが実際に参照されるまで参照先の読み込みを行わない。頻繁に起動を繰り返すようなプログラムで、ごく稀にしか参照先を実際に実行しない場合などで、時間とリソースを節約することができる。
autoloadの効果を確かめるために、少しプログラムを書いてみることにする。例えば以下のようなディレクトリ構造があるとしよう。
- hoge.rb
- lib
- piyo.rb
ここでpiyo.rbは以下の内容として、ロードされると同時にメッセージを出力するようにする。
class Piyo
puts "Piyo was loaded."
end
hoge.rbの内容は以下とする。 もし1が入力された場合はPiyoを参照し、それ以外であれば何もせずに終了する。
autoload :Piyo, "lib/piyo"
if gets.to_i == 1
Piyo
else
# 何もしない
end
これを実行してみると以下のようになる。 確かにPiyoが参照された時だけ、Piyoが実際にロードされることがわかる。
$ ruby hoge.rb
1
Piyo was loaded.
$ ruby hoge.rb
0
