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()を使った方がいいんじゃないかと思いました。