Typing in Ruby
Ruby 型 gradual typing
Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート
RBS: Ruby 3 の型情報を扱う言語を始めとする基盤。Ruby 3 にバンドルされる。
TypeProf: 型注釈のない Ruby コードを型解析するツール。Ruby 3 にバンドルされる。現状の主機能は Ruby コードからの RBS スタブ生成。
Steep/Sorbet: Ruby の静的型検査器。型注釈を書く必要はあるが、Ruby で静的型の便利なプログラミング体験ができる。IDE での補完やドキュメント表示も。
Ruby 3 の静的解析ツール TypeProf の使い方
TypeProf は「型注釈を書かない選択肢を Ruby に残す」ということを至上命題とした極端な設計になっている
型なし言語のための型
Ruby の型チェッカーの比較
Wantedly社によるSorbetとSteepの比較
型検査の速度を主要因としてSorbetを選択
機能比較
https://gyazo.com/4daa219facb6a3b297ecacaadde0ff36
https://twitter.com/snaka/status/1479840029107433472
https://gyazo.com/9bb858e47212ef1f56524f00d8f75289
3rd party gem
Sorbet
tapioca
自動でサードパーティgemの型定義の生成をする
rbi-central (sorbet-typed ?)
コミュニティでシェアされているRBIを使う
自分で書く
gem側で書いている型RBIを参照する
RBS
gem_rbs_collection
型生成
Sorbet
parlour
自分たちのコード、かつ動的に生成されるようなコードの定義を生成するpluginを作れる
https://github.com/Shopify/rbs_parser
Shopifyが取り組んでいた、RBSからRBIを生成するアプローチ
Shopifyにメリットがなかったようで2023年1月にarchiveされたとのこと
https://radanskoric.com/articles/should-i-add-typing-to-my-ruby-project
RBS
https://pocke.hatenablog.com/entry/2020/12/18/230235
TypeProf
静的に型を推論する
rbs prototype rb <foo.rb>
静的に型を推論する
rbs prototype runtime <foo.rb>
対象のRubyスクリプトを実行して動的に生成
Orthorses
TracePointを使って実行時に与えられた型から生成
rbs-dynamic
TracePointを使って実行時に与えられた型から生成
エディタ連携
RubyMine
RBS
Steepとの連携は限定的
RubyMine独自の機構でRBSを読んでくれる
https://blog.jetbrains.com/ruby/2022/11/rubymine-2022-3-released/
メソッドから簡単なRBSを生成できる
RBSファイルがない時に作成できる
ドキュメントをhover等で表示できる
RBI
独自の機構で読んでくれる
https://www.jetbrains.com/help/ruby/sorbet.html
VS Code
どちらにもLanguage Server Protocolで対応するpluginがある
sorbet-lsp
steep-lsp
そろそろRailsプロジェクトに型を導入したい人向けの資料
Steep導入事例
Rubyの静的型検査を利用した開発手法の現状まとめ
2022年2月のまとめ
https://world.hey.com/dhh/programming-types-and-mindsets-5b8490bc
https://twitter.com/dhh/status/1655076668787097607
DHHは圧倒的な型アンチ
RubyだけじゃなくTypeScriptにも批判的
Ruby typing 2024: RBS, Steep, RBS Collections, subjective feelings
brandurによるRBSエコシステム評価
氏はStripeでSorbetを経験しておりいまはGoをメインで書いているぽいので対比しつつ評価している
2ファイルの変更が必要になるのは煩わしすぎる
コードに書けるのはマジックコメントのみ