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
コードを読む人にとっても意図が一目瞭然ですね!
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。