ActiveSupport::Autoload

参考:

ActiveSupport::Autoload | Ruby on Rails API [Official]

使い方

  • 自動読み込みしたい定数を定義するモジュールで内でextend ActiveSupport::Autoload する。
  • autoload :ConstantName, "path/to/file"
  • 定数及びファイル名が Rails の命名規則に従っている場合はパスを省略できる。
  • 指定したファイルで定数を定義する必要がある。
  • 自動読み込みのパスを省略した場合は、命名規則に沿ったファイルで定数を定義する必要がある。
  • Mod.eager_load! を実行すると、自動読み込みが設定された全ての定数に対して強制的に即時読み込みを行う。
  • モジュールのネストに従って探索を行うので、(未ロードの) ネスト外のモジュールで定数が定義されている場合には定義を見つけることはできない。(意図したのとは違った定数が使われる場合がある。)

参考:

ActiveSupport::Autoload を単体で使う | 鳩舎

Rails の autoload の使い方に気をつけよう | TechRacho

定数の自動読み込みと再読み込み | Rails ガイド [公式]

よくある落とし穴 | Rails ガイド [公式]

require_dependency | Rails ガイド [公式]

定数がトリガーされない場合 | Rails ガイド [公式]

autoload

参考:

autoload – ActiveSupport::Autoload | Ruby on Rails API [Official]

eager_autoload / eager_autoload!

eager_autoload ブロック内で autoload 宣言した定数は eager_load! 実行時に自動読み込みを即座に実行する。

eager_autoload do
  autoload :InstantlyAutoloadedModule
end

eager_load!

参考:

active support | Adways エンジニアブログ

eager_autoload – ActiveSupport::Autoload | Ruby on Rails API [Official]

eager_load! – ActiveSupport::Autoload | Ruby on Rails API [Official]

頭字語/アクロニム (acronym)

参考:

Rails autoloading fully capitalized name like API – Stack Overflow

ActiveSupport::Dependencies

参考:

require せずに勝手に読み込まれるとでも思ってるの? – Qiita

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

rails/dependencies.rb at v5.2.2.1 · rails/rails – GitHub

const_missing – rails/dependencies.rb at v5.2.2.1 · rails/rails – GitHub

Ruby の autoload

  • Kernel.#autoload
  • Module#autoload

参考:

module function Kernel.#autoload (Ruby 2.6.0)

instance method Module#autoload (Ruby 2.6.0)

autoload はどうあるべきか

  • Ruby から autoload は削除されない。(少なくとも Ruby 3.0 では)
  • production 環境では eager_load が推奨される。

参考:

Feature #5653: “I strongly discourage the use of autoload in any standard libraries” (Re: autoload will be dead) | Ruby Issue Tracking System

Feature #15592: mode where “autoload” behaves like an immediate “require” | Ruby Issue Tracking System

仕組み

参考:

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

extended

参考:

self.extended から base.class_eval でインスタンス変数初期化 | teratail

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です