Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rubyのクラス宣言に書かれている角かっこ[ ]の意味を調べてみた(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

Rubyのクラス宣言に書かれている角かっこ[ ]の意味を調べてみた(翻訳)

Railsを使ったことがあれば、作成したデータベースマイグレーションファイル内のクラス宣言で、以下の構文を見たことがあるはずです。

class CreateUserTable < ActiveRecord::Migration[7.1]
  def change
    # ...
  end
end

正直に申し上げると、クラス定義のスーパークラス名に角かっこで[7.1]を書いても大丈夫な理由について、これまで何もわかっていませんでしたし、疑問に思ったことすらありませんでした。当時は、自分が気にする必要もないような、いかにもRubyらしい機能だろうと思っただけでおしまいにしていました。

ところが、私がasync-restというgemのコードを読み通しているときに、これと同じ構文がたまたま目に飛び込みました。

現在の私は、Scattergunで利用するPaddle用のクライアントの構築に取り組んでいるのですが、そこでasync-restを使っているものですから、この角かっこ構文が実際には何をするためのものなのかを理解する必要に迫られたのです。

これは絵に描いたような、エレガントなしくみの一種と言えます。この角かっこ[]は言語機能ではなく、以下のようなクラスレベルのメソッドなのです。このメソッドはクラスを返します。

class SomeClass
  def self.[]
    return SomeOtherClass
  end
end

話をActive Recordの例に戻しましょう。

class CreateUserTable < ActiveRecord::Migration[7.1]
  def change
    # ...
  end
end

上のコードは、機能的に以下と同等です。

class CreateUserTable < ActiveRecord::Migration::Compatibility::V7_1
  def change
    # ...
  end
end

RailsコンソールでActiveRecord::Migration[7.1]を実行して、クラスが返ってくることを確認してみてください。まるでメソッド呼び出しのようです!

このメソッド定義は以下にあります。

async-restの場合、これはリソースの表現形式(JSON、フォームなど)を設定する非常にエレガントな方法です。
メソッド定義には、ラッパー クラスを新しいクラス定義に挿入して、それを返す方法が示されています。

このおかげで、コードを以下のように書けるようになります。

module Paddle
  class PaymentMethod < Async::REST::Representation[Async::REST::Wrapper::JSON]
    # ...
  end
end

コードを読む人にとっても意図が一目瞭然ですね!

関連記事

Rails: コントローラのconcernsをテストする方法(翻訳)

Rails: システムテストを複数の画面サイズで実行する(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。