ちょっと挑発的なタイトル使ってみたかっただけです。すみません。
引用するコードなどはRails 4.0.2で。
https://github.com/rails/rails/tree/v4.0.2
ruby2.0.0p247
なぜrequire
せずにクラスやモジュールが使えるのか?
いや、require
しているんですけどね。
どこでどのようにやっているかの話。
どこでしているのか?
またもやAcitveSupportさんです。イケメンですね。
AcitveSupport::Dependencies
https://github.com/rails/rails/blob/v4.0.2/activesupport/lib/active_support/dependencies.rb
詳しい内容は、過去に似たような記事書いてた方がいたので、割愛します。
Rails の自動読み込みの話
http://blog.eiel.info/blog/2013/09/07/autoload-rails/
どういう仕組みか?
rubyにはみなさんご存知、method_missing
のほかにも、const_missing
というmethodがあります。
class Hoge
def call_const_missing
Hoge::Moge
end
def self.const_missing(const_name)
p const_name
end
end
Hoge.new.call_const_missing
#=> :Moge
見つからなかったconstがsymbolでもらえます。
これがもらえればなんとか出来そうですね!
実際、そのような仕組みでAS::Dependenciesもrequire
をしています。
(もうちょっとゴニョゴニョしてるんですが)
そういえば、rubyのautoload
は無くなるのかな?
どうなるのかな。
でも、今のところあんまり使わずに様子見ようって感じかね。
"I strongly discourage the use of autoload in any standard libraries" (Re: autoload will be dead)
https://bugs.ruby-lang.org/issues/5653
ActiveSupport::Autoloadも優秀だと思うけど、path書かないと意図しない読み込みがされたりして怖いんだよね。
まとめ
- 結局、行き着く先は
require
-
const_missing
すごいね -
Kernel.autoload
とModule.autoload
はなくなるかも??