この記事は何
記事投稿キャンペーン「【RubyKaigi 2023連動イベント】みんなでRubyの知見を共有しよう」の参加記事です。
この記事では、「Let's write RBS!」で取り上げられていたrbs subtract
について紹介します。
スライドは↓です。
rbs subtract
について
rbs subtract
については以下の記事に詳しく書かれていますが、二つのrbsファイルのうち、定義が重複しているものを片方から削除することができるようなコマンドです。
以下のような二つのRBSファイルがあったときの例を考えます。
class Example
def hello: (untyped name) -> ::String
def good_morning: (untyped name) -> ::String
end
class Example
def hello: (::String name) -> ::String
end
この二つのRBSファイルに以下のコマンドを実行をします。
$ rbs subtract a.rbs b.rbs
このコマンドの実行結果は以下のとおりです。
class Example
def good_morning: (untyped name) -> ::String
end
このように、b.rbs
で定義されている型がa.rbs
から削除されたRBSが結果として返ってきました。
rbs subtract
を使うことでできること
このコマンドが必要になる場面はズバリ「自動生成された型を自分で修正したい場合」です。
このコマンドがない場合、rbs prototype
などで生成された型をより厳密に記述するようにしたい場合、
RBSファイルは重複した定義があるとエラーになるため、直接自動生成されたファイルを修正する必要があります。
しかしこのような対応を行うと、ぱっと見で「どの型は修正済みで、どの型は修正できていないのか」を把握するのが難しくなります。
rbs subtract
を使うと、以下のようなフローでインクリメンタルに型の改善を行えます。
- 自動生成されたRBSファイルから、修正したい型を把握する
- 自動生成された型を修正したものを別ファイルに記述する
-
rbs subtract
コマンドを用いて、修正した型を自動生成されたRBSファイルから削除する
このサイクルを回すことで、自動生成されたRBSファイルをTODOリストのように扱うことが可能になります。
参考文献