Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Rails の自動読み込みを支える技術

19.206 Aufrufe

Veröffentlicht am

ActiveSupport::Dependencies のソースを読むので簡単に紹介しました。

文章で説明したバージョンはこちらに用意しました。

http://blog.eiel.info/blog/2013/09/07/autoload-rails/

Veröffentlicht in: Technologie, Bildung

Rails の自動読み込みを支える技術

  1. 1. Rails の 自動読み込み を支える技術 2013-09-07 広島Ruby勉強会 #034 13年9月7日土曜日
  2. 2. Rails の読み込み規約 •Hoge -> hoge.rb •HogeMogu -> hoge_mogu.rb •Hoge::Mogu -> hoge/mogu.rb 13年9月7日土曜日
  3. 3. 名前の変換 •ActiveSupport::Inflector.underscore •Core Extention •String#underscore 13年9月7日土曜日
  4. 4. 関連モジュール •ActiveSupport::Dependencies •ActiveSupport::Autoload 13年9月7日土曜日
  5. 5. ActiveSupport::Dependencies 13年9月7日土曜日
  6. 6. 自動読み込み •Rails 用のコードはクラス名から自動読 み込みできる •RAILS_ROOT/app/models/... •RAILS_ROOT/app/helpers/... •... 13年9月7日土曜日
  7. 7. RAILS_ROOT/lib など自動は読み込みできない 13年9月7日土曜日
  8. 8. Rails を使わない場合 require 'active_support/dependencies.rb' ActiveSupport::Dependencies.autoload_paths << 'lib' 13年9月7日土曜日
  9. 9. lib から自動読み込みが できるようになります 13年9月7日土曜日
  10. 10. ライブラリなどでは使わない •自作ライブラリで規約に沿った読み込み は ActiveSupport::Autoload を使う •アプリケーションの記述をシンプルにす るために使う? 13年9月7日土曜日
  11. 11. Rails での初期値 • RAILS_ROOT/app/assets • RAILS_ROOT/app/controllers • RAILS_ROOT/app/helpers • RAILS_ROOT/app/mailers • RAILS_ROOT/app/models • RAILS_ROOT/app/controllers/concerns • RAILS_ROOT/app/models/concerns 13年9月7日土曜日
  12. 12. 仕組み •ConstMissing に処理を追加 •autoload_paths の中にあるか確認 •あれば読み込み •なければ ConstMissing 発生 13年9月7日土曜日
  13. 13. 動作をみたいなら •Logger を設定 •log_activity = true に設定 •Rails の場合は Logger は設定済み 13年9月7日土曜日
  14. 14. Logger を使う require 'active_support/dependencies.rb' require 'logger' ActiveSupport::Dependencies.logger = Logger.new($stderr) ActiveSupport::Dependencies.log_activity = true 13年9月7日土曜日
  15. 15. require するだけで使える • 読み込み時に呼んでるメソッドがある • ActiveSupport::Dependencies.hook! • 止めたい場合は • ActiveSupport::Dependencies.unhook! 13年9月7日土曜日
  16. 16. 知ってると便利かも 13年9月7日土曜日
  17. 17. ActiveSupport::Dependencies .warnings_on_first_load •はじめて読み込みしたクラス •ログに出力 •二度目は出力しない 13年9月7日土曜日
  18. 18. ActiveSupport::Dependencies .history •読み込みしたクラスが格納 •Set で格納 •順番はわからない 13年9月7日土曜日
  19. 19. ActiveSupport::Dependencies .loaded •読み込みしたクラスがわかる •History との違い •clear されることがある •これも Set 13年9月7日土曜日
  20. 20. ActiveSupport::Dependencies .mechanism •読み込みする時 に •load を使うか (デフォルト) •require を使うか •環境変数 NO_RELOAD を設定で •require に 13年9月7日土曜日
  21. 21. ActiveSupport::Dependencies .explicitly_unloadable_constants •自動読み込みの対象にしない名前を登録 13年9月7日土曜日
  22. 22. ActiveSupport::Autoload 13年9月7日土曜日
  23. 23. ライブラリで規約を利用 •Rails のコードではよく使われている •lib/active_support.rb •lib/active_record.rb 13年9月7日土曜日
  24. 24. autoload を拡張 •Kernel.autoload(module, filename) •Module.autoload(module, filename) •引数が2つ必要 13年9月7日土曜日
  25. 25. autoload を拡張 • ActiveSupport::Autoload • #autoload(const_name, path = @@at_path) • 第2引数が オプションに 13年9月7日土曜日
  26. 26. autoloadについて •あるクラスが必要になった時にはじめて ファイルを読み込みする •第1引数 あるクラスの名前 •第2引数 読み込みするファイル 13年9月7日土曜日
  27. 27. 第2引数は 規約から推測可能 13年9月7日土曜日
  28. 28. Kernelのほうはそのまま 13年9月7日土曜日
  29. 29. Module のほうだけ拡張 13年9月7日土曜日
  30. 30. 例 require 'active_support/dependencies/autoload' module Hoge extend ActiveSupport::Autoload autoload :Mogu end Hoge::Mogu # > LoadError: cannot load such file -- hoge/mogu 13年9月7日土曜日
  31. 31. eager_autoload と autoload! 13年9月7日土曜日
  32. 32. よくある光景 eager_autoload do autoload :Hoge autoload :Mogu end 13年9月7日土曜日
  33. 33. auto_load! •eager_autoload の中にかいておくと auto_load! でまとめて読み込みできる •利点がはっきりとわからないです •知ってたら教えて 13年9月7日土曜日
  34. 34. ご清聴ありがとうございます 13年9月7日土曜日

×