個人的 Sorbet 三種の神器

結論: T.bind, T.cast, .rbi

Rubyの言語仕様やSorbetの仕様、Sorbetのエコシステムの現状により、日々上記メソッドや機能に頼りながらSorbetを使用しているのでここに記しておきます(T.bindとT.castは元をたどるとT.letなのでそもそも3つもないとも言えますが…)。

T.bind

T.bindについては、[Sorbet] selfが迷子の時はT.bind で書いた通り、selfが判別できないいくつかのパターン(自分は主にmoduleとlambda)で使用します。詳細はリンク先に書いている通りなので使い方だけ書いておきます。

1
2
3
T.bind(self, A) # lambdaが外側のスコープにあるメソッドを判別できない場合にこんな感じで使用

T.bind(self, T.any(A, B)) # moduleがAクラスとBクラスで使用されるような場合にこんな感じで使用

T.cast

自分はRailsのControllerのparamsメソッドでよく使用しています。paramsの型定義をちゃんとしておけばT.letでもいけると思いますが面倒なのでT.castで済ませています。

下記のように使用しています。

1
hoge = T.cast(params[:hoge], String)

T.castはTypeScriptのasと同等です。

.rbi

これはメソッドではなくrbiファイルの話ですがrbi上で定義することで実装ファイルを変更することなく型定義を行うことができます(思想的にはrbsと同じように外部ファイルとして型を定義するだけという認識)。

あるAクラスに動的にhogeメソッドが追加されている場合には下記のようにrbiファイルに書き足すことで型として参照することができるようになります(良くも悪くもhogeメソッドが本当にあるかは別として)

1
2
3
4
5
# typed: true
class A
  sig { void }
  def hoge; end
end

ちゃんと調べてないのでもしかしたらsorbet-railsのようなgemで自分が想定している使用範囲でも型を生成することができるかもしれませんが、自分はとりあえずkaminariのpageメソッドなどを追加したり、実装としては存在しているけどsorbet-typed上には存在していないメソッドを追加するなどして使用しています。

Built with Hugo
テーマ StackJimmy によって設計されています。