Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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)」の精神ですね。

ルールに従ってさえいれば、すべてが自動的に行われます。ルールは以下の通りです:

  1. ファイルを見つけられる場所に置く(ActiveSupport::Dependencies.autoload_pathsで定義されたパス)
  2. 1ファイルにつき1つのクラス/モジュールを定義する
  3. クラス名に合わせてアンダースコア形式でファイル名をつける(UsersControllerusers_controller.rb

こうしておけば、コード内でこれらのクラス名が参照されるたびに、Railsはどこにファイルがあるかを把握しています。

とても便利ですね。

Rails 6以降のオートロード:Zeitwerkの登場

Rails 6では、新しい定数オートロード機構としてZeitwerkが導入されました。

従来の「Classic」方式と何が違うのでしょうか?

旧バージョンが採用していたconst_missing方式は、モジュールのネスト情報などを持たないため、さまざまな制限がありました。

一方、ZeitwerkはRubyネイティブのautoloadを使用します。

新しい実装でも、ファイル命名規則はほぼ同じです。

実際には:

Zeitwerkはファイル名からクラス名を推測します(users_controller.rbUsersController)。これは従来とは正反対のアプローチです。

ちなみに、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プロジェクトを最も効率的な形で構成できるようになります。

さあ、あなたの番です。エディタを開いて、楽しく試してみましょう!

最後までお読みいただきありがとうございました🙂

  1. Ruby on Railsとは?初心者にもわかる仕組み・魅力・学び方を徹底解説

    Ruby on Railsとは? Ruby on Rails(略称:RoR)は、世界で最も人気のあるオープンソースのWebアプリケーションフレームワークです。プログラミング言語「Ruby」をベースに構築されており、シンプルなサイトから大規模で複雑なサービスまで、幅広いWebアプリケーションの開発を支援します。 そもそもフレームワークとは? フレームワークとは、ソフトウェア開発の際に土台となる構造を提供してくれるコードやツール、ユーティリティの集合体です。あらかじめ用意された構造に沿ってコードを書くことで、プログラムが整理され、保守性も高まります。正しく使いこなせるようになれば、開発作業は格段に

  2. Rackとは?Ruby開発者のための基本仕組みと自作ミドルウェア入門

    RailsやSinatraなど、あらゆるRuby製Webフレームワークの裏側では、何が起こっているのでしょうか? その答えがRackです。フレームワークとサーバーをつなぐ、まさに要となる存在です。 では、Rackとは一体何なのでしょうか? Rackは、Webフレームワーク(Railsなど)とアプリケーションサーバー(Pumaなど)の間に位置する「層」です。 両者が正しくやり取りできるようにする、糊(グルー)のような役割を担っています。 なぜRackを使うのか? Rackを使う最大の理由は、異なるフレームワークとサーバーを自由に組み合わせられるようにするためです。 それぞれが差し替え可能なプラ