この記事は何
記事投稿キャンペーン「【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リストのように扱うことが可能になります。
参考文献