RubyのZeitwerkとモジュール自動読み込みをわかりやすく解説
Rubyにおけるクラスやモジュールの自動読み込み(オートロード)について解説します。Rails 6から標準搭載された「Zeitwerk」gemの仕組みも含めて、初心者にもわかりやすく説明していきます。
そもそもオートロードとは?
まず、こんな疑問から始めましょう。
「複数のソースコードファイルを1つにまとめるには、どうすればいいのか?」
答えはrequireです。ファイルをrequireすると、Rubyはそのファイルを読み込み、中のコードを実行します。
しかし、必要なファイルが大量にある場合、そのすべてを最初に読み込む必要はないことに気づくでしょう。
少なくとも、アプリ起動直後には必要ないはずです。
必要になったタイミングでだけファイルを読み込めれば、アプリケーションはもっと速く起動できる——これを実現するのがオートロードです!
Ruby組み込みのautoloadの使い方
Rubyには、言語レベルでオートロード機能が組み込まれています。
その仕組みは定数(constant)に基づいています。
Coconutのような定数が初めて参照されたとき、Rubyは関連付けられたファイルを読み込もうとします。
ただし、その前に、定数とファイル名を登録しておく必要があります。
次のように書きます:
autoload :Coconut, "lib/coconut.rb"
こう登録しておけば、Coconutクラスやモジュールを使いたいとき、Rubyはどこを見ればいいかを把握しています。
でも、もっと便利にできないでしょうか?
定数を手動で登録しなくても、Rubyがすべての場所を自動的に把握してくれる——そんな世界があれば素敵ですよね。
実は、それこそがRailsのやっていることです。ただし、Rails 6より前は、このautoloadメカニズムは使われていませんでした。
Rails 6以前のオートロード(Classicモード)
Rails 5までの「Classic」オートローダーは、autoloadではなくconst_missingというフックを使って、プロジェクト内のファイルを自動的に検索・読み込んでいました。
なぜそれが便利なのか?
Railsプロジェクトでrequireを書かなくてよくなるからです。
まさに「設定より規約(Convention over Configuration)」の精神ですね。
ルールに従ってさえいれば、すべてが自動的に行われます。ルールは以下の通りです:
- ファイルを見つけられる場所に置く(
ActiveSupport::Dependencies.autoload_pathsで定義されたパス) - 1ファイルにつき1つのクラス/モジュールを定義する
- クラス名に合わせてアンダースコア形式でファイル名をつける(
UsersController→users_controller.rb)
こうしておけば、コード内でこれらのクラス名が参照されるたびに、Railsはどこにファイルがあるかを把握しています。
とても便利ですね。
Rails 6以降のオートロード:Zeitwerkの登場
Rails 6では、新しい定数オートロード機構としてZeitwerkが導入されました。
従来の「Classic」方式と何が違うのでしょうか?
旧バージョンが採用していたconst_missing方式は、モジュールのネスト情報などを持たないため、さまざまな制限がありました。
一方、ZeitwerkはRubyネイティブのautoloadを使用します。
新しい実装でも、ファイル命名規則はほぼ同じです。
実際には:
Zeitwerkはファイル名からクラス名を推測します(users_controller.rb → UsersController)。これは従来とは正反対のアプローチです。
ちなみに、autoload_pathsは引き続き利用できますが、追加するのは"/lib"のようなベースパスのみにしましょう。"/lib/**"のようなワイルドカード指定は不要です。
なぜでしょうか?
それは、名前空間(namespace)とネストの扱い方に関係しています。
"lib"をautoloadパスに登録している場合、Fruit::Orangeを定義するにはファイル名は"lib/fruit/orange.rb"である必要があります。- しかし、
"lib/fruit"を登録した場合は別フォルダが必要になり、同じクラスなのに"lib/fruit/fruit/orange.rb"という二重のパスになってしまいます。
一番嬉しいポイントは?
この新機能はRailsに密結合していないため、Railsを使わないプロジェクトでもZeitwerkを利用できるということです!
まとめ
この記事では、Rubyにおけるモジュールのオートロードとは何か、そしてどのように動作するのかを学びました。
この知識があれば、Rubyプロジェクトを最も効率的な形で構成できるようになります。
さあ、あなたの番です。エディタを開いて、楽しく試してみましょう!
最後までお読みいただきありがとうございました🙂
-
Ruby on Railsとは?初心者にもわかる仕組み・魅力・学び方を徹底解説
Ruby on Railsとは? Ruby on Rails(略称:RoR)は、世界で最も人気のあるオープンソースのWebアプリケーションフレームワークです。プログラミング言語「Ruby」をベースに構築されており、シンプルなサイトから大規模で複雑なサービスまで、幅広いWebアプリケーションの開発を支援します。 そもそもフレームワークとは? フレームワークとは、ソフトウェア開発の際に土台となる構造を提供してくれるコードやツール、ユーティリティの集合体です。あらかじめ用意された構造に沿ってコードを書くことで、プログラムが整理され、保守性も高まります。正しく使いこなせるようになれば、開発作業は格段に
-
Rackとは?Ruby開発者のための基本仕組みと自作ミドルウェア入門
RailsやSinatraなど、あらゆるRuby製Webフレームワークの裏側では、何が起こっているのでしょうか? その答えがRackです。フレームワークとサーバーをつなぐ、まさに要となる存在です。 では、Rackとは一体何なのでしょうか? Rackは、Webフレームワーク(Railsなど)とアプリケーションサーバー(Pumaなど)の間に位置する「層」です。 両者が正しくやり取りできるようにする、糊(グルー)のような役割を担っています。 なぜRackを使うのか? Rackを使う最大の理由は、異なるフレームワークとサーバーを自由に組み合わせられるようにするためです。 それぞれが差し替え可能なプラ