2025年 04月 30日
こんにちは、CTO の小宮です。
先日開催された RubyKaigi 2025 で “Introducing Type Guard to Steep” というタイトルで発表を行いました。
このトークでは、Steep の型の絞り込み (Type Narrowing) をさらに便利にするという取り組みを紹介しました。
こちらが発表のスライドです。
Steep にはもともと型の絞り込みに関する機能が実装されていたのですが、Ruby のビルトインメソッドや標準の文法 (if の nil チェックなど) には対応しているものの、それ以外のメソッドでは型の絞り込みが発生していませんでした。そのため、実際のコードを型チェックさせると実装者の意図に反するエラーを検出していました。
その中でも手元でエラーが多く検出されたのが ActiveSupport の #present?
, #blank?
メソッドです。我々のアプリケーションではちょこちょこ nil チェックがわりに利用されていることもあり、対応が必要とされていました。
※ これらのメソッドで nil チェック相当のことをするな、単にメソッドコールなしの if/else でよいだろうというご指摘はごもっともですし、僕も同意します。しかし、コードをなるべく変更せずに型チェックをさせたかったという事情もあります。
当初は #present?
メソッドも User-defined Type Guard として実装しようと考えていたのですが、今回のトーク向けに実装を煮詰めていった結果、今のアプローチが思いついたため独立したふたつの実装として整理しました。メソッド呼び出しの返り値に基づいて、レシーバーの型が絞り込まれるというのはプログラマの脳内イメージに近い動きで、素直な絞り込みルールとして落とし込めたのではないかと考えています。
今回のトークでは「型の絞り込みとは」という話を最初にしたのですが、型システムというのはいままでプログラマの頭の中でイメージしていたものをコンピューターが理解できるように具体化、明示したものだと考えています。そして、コンピューターが型を計算できることによって、開発者へのサジェストや型チェックを通じて開発体験を向上させています。
Ruby に型がいる/いらないという議論ではなく、すでに存在している型を “どれくらい” コンピューターに認識させるのかという話に置き換えていけるとよさそうです。
今後もシームレスに型のサポートを受けられるよう、エコシステムへの改善を続けていこうと思います。
自分のトークが初日のキーノート直後という、ある意味恵まれた時間帯だったこともあり、会期中はマイペースに見聞きできました。自分の出番があとの方になると、なかなか落ち着いて他のトークを聞けないので助かりました。
その中でも、今回は色んな人と立ち話ができました。型に興味がある人が増えてきたので、多くの型ハッカー・型ユーザーの方とお話できて、非常に参考になりました。また、今回は RubyKaigi 全体でも型に関するトークが 6本もあり、型の盛り上がりを感じます。RubyKaigi のつもりが、実は TypeKaigi に迷い込んでいたのかもしれません。
来年は函館での開催ということで、次回も面白い Kaigi になるといいですね。できれば僕もなにかアウトプットを進めていきたいと思います。
今回の松山では、おいしい宇和島風の鯛めしをあちこちで食べて非常に満足しました。弊社のメンバーに宇和島しか勝たん、という布教が出来たのも良かったです。次回の函館でも美味しいものを食べたいですね
今回もさまざまな方に助けられて、発表までこぎつけることが出来ました。コミュニティのみなさん、同僚のみなさん、型に興味を持ってるみなさん、色んな方に感謝したいと思います。
また、毎回参加費を支援してくれている弊社タイムインターメディアにも多大なる感謝をしたいと思います。