requireとautoloadについて

今日はRubyの話です。

main.rb

#!ruby
require 'hoge'

こうすると、hoge.rbの中身が全部読み込まれて、main.rbの中で使えるようになります。

main.rb

#!ruby
autoload(:Hoge, 'hoge')

このままでは、main.rbのなかでhoge.rbは読み込まれてはいません。

main.rb

#!ruby
autoload(:Hoge, 'hoge')
p Hoge

p Hogeを実行した時点で、hoge.rbが読み込まれます。
つまり、参照されたタイミングで読み込みを行うように「予約」しておくのがautoload()なんですね。
それにたいして、require()は、require()が実行されたタイミングで読み込みが行われます。

全部読み込んで使いたい場合は、require()
使うものと使わないものが混在している場合は、autoload()
とすると、エコ(謎)ですね。

次に具体的な例をあげてみます。

module_a.rb

#!ruby
module ModA
  def hoge
    return "hoge"
  end
end

module_b.rb

#!ruby
module ModB
  def fuga
    return "fuga"
  end
end

require_case.rb

#!ruby
require 'module_a'
require 'module_b'
p ModA.hoge

autoload_case.rb

#!ruby
autoload(:ModA, 'module_a')
autoload(:ModB, 'module_b')
p ModA.hoge

ModA、ModBというモジュールをそれぞれmodule_a.rbとmodule_b.rbに定義しておいて
それらをrequireとautoloadそれぞれで読み込んで使ってみます。

このとき、require()の場合だとmodule_a.rbもmodule_b.rbも両方読み込んでいるので
どちらのモジュールも即座に使う事ができます。
そのかわり、require_case.rbでは実際に使わなかったmodule_b.rbも読み込んでしまいましたね。

これに対して、autoload()の場合だとautoload()を実行した段階ではまだmodule_a.rbも
module_b.rbも読み込まれてはいません。
ModAまたはModBを参照したタイミングで、module_a.rbやmodule_b.rbが読み込まれます。
使うときにはじめて読み込まれるために、require()よりは動作するまでに若干の間が生じます。
そのかわり、autoload_case.rbでは実際に使われたmodule_a.rbだけが読み込まれて
実際に使われなかったmodule_b.rbは読み込みませんでした。エコ(何)ですね。

最初に全部読み込んでしまうか、使うときにはじめて読み込むか。
ケースバイケースだとは思いますが、今まで全部require()でやってきた僕は
場合によってはautoload()を使った方がいいんじゃないかと思いました。