2022年3月31日木曜日

Sorbet 超入門

Sorbet 超入門

概要

Stripe が作成した型チェックツール Sorbet (しゃーべっと)を使ってみました

過去に紹介した記事では typeprof + rbs + steep を使っていますが Sorbet はこれだけで使えます

環境

  • macOS 11.6.5
  • Ruby 2.6.5
  • Sorbet 0.5.9798

事前準備

Ruby3 でやるといろいろとエラーになるので Ruby2.6.5 で試しました

rbenv などを使って今回用にインストールしてあげましょう

  • rbenv install 2.6.5
  • cd /path/to/try_sorbet
  • rbenv local 2.6.6

インストール

  • bundle init
  • vim Gemfile
gem "sorbet"
gem "sorbet-runtime"
  • bundle install --path vendor/bundle

一応ポイントですが空の状態からやったほうがいいです既存の gem がある状態でやるといろいろとエラーが出ました

とりあえず使ってみる

srb tc コマンドで型チェックできます

  • bundle exec srb tc -e 'puts "Hello, world!"'`

プロジェクト初期化

  • bundle exec srb init

とりあえず Yes で初期化します
いろいろとログが流れますが待ちましょう
sorbet/ ディレクトリが作成されれば OK です

テスト用スクリプト作成

公式のサンプルをそのまま持ってきます

  • vim app.rb
# typed: true
require 'sorbet-runtime'

class A
  extend T::Sig

  sig {params(x: Integer).returns(String)}
  def bar(x)
    x.to_s
  end
end

def main
  A.new.barr(91)   # error: Typo!
  A.new.bar("91")  # error: Type mismatch!
end

型チェック実行

srb tc で実行できます

  • bundle exec srb tc
app.rb:14: Method barr does not exist on A https://srb.help/7003
    14 |  A.new.barr(91)   # error: Typo!
                ^^^^
  Got A originating from:
    app.rb:14:
    14 |  A.new.barr(91)   # error: Typo!
          ^^^^^
  Autocorrect: Use `-a` to autocorrect
    app.rb:14: Replace with bar
    14 |  A.new.barr(91)   # error: Typo!
                ^^^^

app.rb:15: Expected Integer but found String("91") for argument x https://srb.help/7002
    15 |  A.new.bar("91")  # error: Type mismatch!
                    ^^^^
  Expected Integer for argument x of method A#bar:
    app.rb:7:
     7 |  sig {params(x: Integer).returns(String)}
                      ^
  Got String("91") originating from:
    app.rb:15:
    15 |  A.new.bar("91")  # error: Type mismatch!
                    ^^^^
Errors: 2

タイポと型エラーが表示できるのが確認できます

書き方の説明

# typed: true

require の前に必須になります
もし既存の Ruby スクリプトがあれば init 時に自動で挿入してくれます

extend T::Sig

クラス内で使う場合には必須になります
これで sig 構文が使えるようになります

sig {params(x: Integer).returns(String)}

これがいわゆるタイプアノテーションになります
メソッドチェーンで記載します
各種パラメータの型と返り値の型を指定します
プリミティブ型以外にも独自で定義したクラスも指定できます

最後に

まだまだ開発中なのでもう少し成熟するのを待ったほうがいいかもしれません

参考サイト

0 件のコメント:

コメントを投稿