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

34
Rails 自動読み込み を支える技術 2013-09-07 広島Ruby勉強会 #034 1397日土曜日

Upload: tomohiko-himura

Post on 24-May-2015

10.835 views

Category:

Technology


3 download

DESCRIPTION

ActiveSupport::Dependencies のソースを読むので簡単に紹介しました。 文章で説明したバージョンはこちらに用意しました。 http://blog.eiel.info/blog/2013/09/07/autoload-rails/

TRANSCRIPT

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

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

2013-09-07 広島Ruby勉強会 #034

13年9月7日土曜日

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

Rails の読み込み規約

• Hoge -> hoge.rb• HogeMogu -> hoge_mogu.rb• Hoge::Mogu -> hoge/mogu.rb

13年9月7日土曜日

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

名前の変換

• ActiveSupport::Inflector.underscore• Core Extention• String#underscore

13年9月7日土曜日

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

関連モジュール

• ActiveSupport::Dependencies• ActiveSupport::Autoload

13年9月7日土曜日

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

ActiveSupport::Dependencies

13年9月7日土曜日

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

自動読み込み

• Rails 用のコードはクラス名から自動読み込みできる

• RAILS_ROOT/app/models/...• RAILS_ROOT/app/helpers/...• ...

13年9月7日土曜日

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

RAILS_ROOT/libなど自動は読み込みできない

13年9月7日土曜日

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

Rails を使わない場合

require 'active_support/dependencies.rb'ActiveSupport::Dependencies.autoload_paths << 'lib'

13年9月7日土曜日

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

lib から自動読み込みができるようになります

13年9月7日土曜日

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

ライブラリなどでは使わない

•自作ライブラリで規約に沿った読み込みは ActiveSupport::Autoload を使う

•アプリケーションの記述をシンプルにするために使う?

13年9月7日土曜日

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

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日土曜日

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

仕組み

• ConstMissing に処理を追加• autoload_paths の中にあるか確認•あれば読み込み•なければ ConstMissing 発生

13年9月7日土曜日

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

動作をみたいなら

• Logger を設定• log_activity = true に設定• Rails の場合は Logger は設定済み

13年9月7日土曜日

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

Logger を使う

require 'active_support/dependencies.rb'require 'logger'ActiveSupport::Dependencies.logger = Logger.new($stderr)ActiveSupport::Dependencies.log_activity = true

13年9月7日土曜日

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

require するだけで使える

• 読み込み時に呼んでるメソッドがある• ActiveSupport::Dependencies.hook!• 止めたい場合は• ActiveSupport::Dependencies.unhook!

13年9月7日土曜日

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

知ってると便利かも

13年9月7日土曜日

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

ActiveSupport::Dependencies.warnings_on_first_load

•はじめて読み込みしたクラス•ログに出力•二度目は出力しない

13年9月7日土曜日

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

ActiveSupport::Dependencies.history

•読み込みしたクラスが格納• Set で格納•順番はわからない

13年9月7日土曜日

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

ActiveSupport::Dependencies.loaded

•読み込みしたクラスがわかる•History との違い• clear されることがある•これも Set

13年9月7日土曜日

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

ActiveSupport::Dependencies.mechanism

•読み込みする時 に• load を使うか (デフォルト)• require を使うか•環境変数 NO_RELOAD を設定で • require に

13年9月7日土曜日

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

ActiveSupport::Dependencies.explicitly_unloadable_constants

•自動読み込みの対象にしない名前を登録

13年9月7日土曜日

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

ActiveSupport::Autoload

13年9月7日土曜日

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

ライブラリで規約を利用

• Rails のコードではよく使われている• lib/active_support.rb• lib/active_record.rb

13年9月7日土曜日

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

autoload を拡張

• Kernel.autoload(module, filename)• Module.autoload(module, filename)•引数が2つ必要

13年9月7日土曜日

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

autoload を拡張

• ActiveSupport::Autoload• #autoload(const_name, path = @@at_path)• 第2引数が オプションに

13年9月7日土曜日

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

autoloadについて

•あるクラスが必要になった時にはじめてファイルを読み込みする

•第1引数 あるクラスの名前•第2引数 読み込みするファイル

13年9月7日土曜日

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

第2引数は規約から推測可能

13年9月7日土曜日

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

Kernelのほうはそのまま

13年9月7日土曜日

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

Module のほうだけ拡張

13年9月7日土曜日

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

例require 'active_support/dependencies/autoload'

module Hoge extend ActiveSupport::Autoload autoload :Moguend

Hoge::Mogu# > LoadError: cannot load such file -- hoge/mogu

13年9月7日土曜日

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

eager_autoload と autoload!

13年9月7日土曜日

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

よくある光景

eager_autoload do autoload :Hoge autoload :Moguend

13年9月7日土曜日

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

auto_load!

• eager_autoload の中にかいておくと auto_load! でまとめて読み込みできる

•利点がはっきりとわからないです•知ってたら教えて

13年9月7日土曜日

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

ご清聴ありがとうございます

13年9月7日土曜日