Upload
tomohiko-himura
View
10.835
Download
3
Embed Size (px)
DESCRIPTION
ActiveSupport::Dependencies のソースを読むので簡単に紹介しました。 文章で説明したバージョンはこちらに用意しました。 http://blog.eiel.info/blog/2013/09/07/autoload-rails/
Citation preview
Rails の 自動読み込みを支える技術
2013-09-07 広島Ruby勉強会 #034
13年9月7日土曜日
Rails の読み込み規約
• Hoge -> hoge.rb• HogeMogu -> hoge_mogu.rb• Hoge::Mogu -> hoge/mogu.rb
13年9月7日土曜日
名前の変換
• ActiveSupport::Inflector.underscore• Core Extention• String#underscore
13年9月7日土曜日
関連モジュール
• ActiveSupport::Dependencies• ActiveSupport::Autoload
13年9月7日土曜日
ActiveSupport::Dependencies
13年9月7日土曜日
自動読み込み
• Rails 用のコードはクラス名から自動読み込みできる
• RAILS_ROOT/app/models/...• RAILS_ROOT/app/helpers/...• ...
13年9月7日土曜日
RAILS_ROOT/libなど自動は読み込みできない
13年9月7日土曜日
Rails を使わない場合
require 'active_support/dependencies.rb'ActiveSupport::Dependencies.autoload_paths << 'lib'
13年9月7日土曜日
lib から自動読み込みができるようになります
13年9月7日土曜日
ライブラリなどでは使わない
•自作ライブラリで規約に沿った読み込みは ActiveSupport::Autoload を使う
•アプリケーションの記述をシンプルにするために使う?
13年9月7日土曜日
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日土曜日
仕組み
• ConstMissing に処理を追加• autoload_paths の中にあるか確認•あれば読み込み•なければ ConstMissing 発生
13年9月7日土曜日
動作をみたいなら
• Logger を設定• log_activity = true に設定• Rails の場合は Logger は設定済み
13年9月7日土曜日
Logger を使う
require 'active_support/dependencies.rb'require 'logger'ActiveSupport::Dependencies.logger = Logger.new($stderr)ActiveSupport::Dependencies.log_activity = true
13年9月7日土曜日
require するだけで使える
• 読み込み時に呼んでるメソッドがある• ActiveSupport::Dependencies.hook!• 止めたい場合は• ActiveSupport::Dependencies.unhook!
13年9月7日土曜日
知ってると便利かも
13年9月7日土曜日
ActiveSupport::Dependencies.warnings_on_first_load
•はじめて読み込みしたクラス•ログに出力•二度目は出力しない
13年9月7日土曜日
ActiveSupport::Dependencies.history
•読み込みしたクラスが格納• Set で格納•順番はわからない
13年9月7日土曜日
ActiveSupport::Dependencies.loaded
•読み込みしたクラスがわかる•History との違い• clear されることがある•これも Set
13年9月7日土曜日
ActiveSupport::Dependencies.mechanism
•読み込みする時 に• load を使うか (デフォルト)• require を使うか•環境変数 NO_RELOAD を設定で • require に
13年9月7日土曜日
ActiveSupport::Dependencies.explicitly_unloadable_constants
•自動読み込みの対象にしない名前を登録
13年9月7日土曜日
ActiveSupport::Autoload
13年9月7日土曜日
ライブラリで規約を利用
• Rails のコードではよく使われている• lib/active_support.rb• lib/active_record.rb
13年9月7日土曜日
autoload を拡張
• Kernel.autoload(module, filename)• Module.autoload(module, filename)•引数が2つ必要
13年9月7日土曜日
autoload を拡張
• ActiveSupport::Autoload• #autoload(const_name, path = @@at_path)• 第2引数が オプションに
13年9月7日土曜日
autoloadについて
•あるクラスが必要になった時にはじめてファイルを読み込みする
•第1引数 あるクラスの名前•第2引数 読み込みするファイル
13年9月7日土曜日
第2引数は規約から推測可能
13年9月7日土曜日
Kernelのほうはそのまま
13年9月7日土曜日
Module のほうだけ拡張
13年9月7日土曜日
例require 'active_support/dependencies/autoload'
module Hoge extend ActiveSupport::Autoload autoload :Moguend
Hoge::Mogu# > LoadError: cannot load such file -- hoge/mogu
13年9月7日土曜日
eager_autoload と autoload!
13年9月7日土曜日
よくある光景
eager_autoload do autoload :Hoge autoload :Moguend
13年9月7日土曜日
auto_load!
• eager_autoload の中にかいておくと auto_load! でまとめて読み込みできる
•利点がはっきりとわからないです•知ってたら教えて
13年9月7日土曜日
ご清聴ありがとうございます
13年9月7日土曜日