RBS v3.3.0のリリースノートを読む

RBS v3.3.0がリリースされたのでリリースノートを読んでみたいと思います。

https://github.com/ruby/rbs/wiki/Release-Note-3.3

Add rbs diff command

新コマンド追加です。

https://github.com/ruby/rbs/issues/1448

にPR作者の意気込みが書かれていますね。

例えばgem_rbs_collectionへPRを出す時に、RBSの自動生成をしたものだと差分が大きくて何が変わったのか、なにか抜け落ちてないか見抜くのは困難になります。そこで、結局何が変わったのかメソッド単位で差分を突き合わせて、「増えたもの」「減ったもの」「変わったもの」を抜き出して表示する。しかもPRに貼り付けることを意識してのmarkdown table形式や、CLI出力を意識しての色付きdiff形式等、出力形態も選べるようです。しかもこういう調査は結果さえわかればいいので手軽に実行したい。なのでいちいちスクリプトを書いて実行するのはしんどい。よって新コマンド追加というわけですかね。

なるほど、現実的な課題に向かい合った結果の機能追加というわけですね。

Add --todo option to rbs prototype runtime

これもPR作者の意気込みが書かれた文章が見つかりました。

https://github.com/ruby/rbs/issues/1449

内容をエスパーすると、最初の動機は上記のrbs diffコマンドを実験していた時に実際に実行したときのinstance_methodsなりとRBS定義とをdiffで比較してみると、意外とRBSの定義漏れを発見できて便利なんじゃないか?と思ったようですね。 そこからrbs diffコマンドとは分離して、rbs todoコマンドを想像したようですが、pockeさんから「rbs prototype runtime と絡めるといいんじゃないか」という助言をもらい、rbs prototype runtimeのオプションとする案に落ち着いたようです。あくまでエスパーです。

このオプションを使うと、実際には存在するんだけど、RBSはまだ無いものだけをプロトタイプとして生成してくれるもののようです。 実際のデモでもIOのような組み込みクラスでも、まだ実装されていないメソッドが見つかっています。 「RBSになにか貢献したいなあ」と思っている方も、これを使ってまだ無いメソッドを探してPRで追加することができそうですね。

Add __todo__ type

これは名前から察するに、上記の--todoオプションと関連するかと思いきや、実は関係ない変更です。たまたま名前が被ったようですね。 __todo__は、ほぼuntypedと同じですが、"なんでもいいよ"という意味のuntypedと、"まだ決めれてないよ"という意味のuntypedを分けて管理できるようにしたんじゃないかと思います。

prototypeの出力こそまさに__todo__向きかも?

Additional syntactic validation with rbs validate

rbs validateでチェックする項目が増えました。引数にvoidを使ったり、定数にselfを使ったり等、型の使い方を間違えていると教えてくれるようになったようです。間違うとどう動くんだろ。 新しく追加されたエラーはwarning的な扱いですが、将来的には文法エラーとして実装予定らしいのでこのエラーを見たらすぐに修正するとよさそうです。

Delete sources: section from rbs_collection.lock.yaml

rbs_collection.lock.yamlファイルのsources:セクションは実はもう使ってないので削除されたようです。

ついでのCHANGELOGも読む

Signature updates

coreの型が数多く修正されています。ほとんど同じ人がやっていて、数がすごい。

Library changes

バグ修正が多いですが、少しピックアップしてみましょう。

Show location of type by method command (#1537)

rbs methodコマンドの出力として、型情報が記述されているファイルの場所が出力されるようになったようです。型情報を直したい時にすぐに見つけれて便利かも。

Better support for inherited class of Struct or Data by prototype runtime #1571

StructDataを継承したclassの場合にいい感じにプロトタイプが出力されるようになったようです。

This will be one of the most important improvements in RBS 3.3. 🎉

なんかすごそうですね。

StructDataによって作られたclassの型をどう書くかという問題は度々議論に上がっていましたが、この変更によってある程度の回答とできそうですね。

[prototype runtime] Add --autoload option (#1561)

rbs prototype runtimeはautoloadの壁を越えれないという弱点があったのですが、--autoloadというオプションをつければ限界を超えれるようです。将来的にデフォルトで有効になりそうな感じで書かれています。

[prototype runtime] Optimize performance (#1495)

マイクロベンチマークによると、classが1万個ある場合だと、100sから1sと100倍早くなってます。Railsアプリケーションとかだとそれぐらいいくので嬉しそうです。

[Collection] Simple colorize collection text like Bundler (#1558)

rbs collectionコマンドでBundlerのように色がつくようになったみたいです。色がつくとなんかちゃんとしてる感があっていいですね。