memo.log

技術情報の雑なメモ

【Ruby 3.0】RBSの生成方法を色々試してみるメモ

以下の3つの方法を順番に試してみる。 引数/戻り値の型は記載されていてほしいのでtypeprof が動くのならそれを利用するのがベターそう。 各方法の解説は参考リンクのページが詳しい。

  • rbs prototype rb
    • Rubyファイルを指定して静的に解析
    • 引数/戻り値の型は基本 untyped になる
  • rbs prototype runtime
    • Ruby実行ファイルを指定して解析
    • 引数/戻り値の型は untyped になる
  • TypeProf
    • Ruby実行ファイルを指定して解析
    • 引数/戻り値の型は実行結果から自動で推定される

環境:

 % ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [aarch64-linux]

rbs prototype rb

Rubyファイル

  • とりあえずIntegerのパラメータを1つだけ取るコンストラクタを持つ Kure クラスを準備してみる。
  • run はその値を返す
  • test1 を固定で返す
class Kure
  # @param num [Integer]
  def initialize(num)
    raise "Parameter Invalid" unless num.is_a?(Integer)

    @num = num
  end

  def run
    @num
  end

  def test
    1
  end
end

RBS作成

  • コンストラクタと run メソッド引数と戻り値の型は無い。
  • test メソッドは 1 を固定で返すことが読み込まれて1が記載されている。
 % rbs prototype rb test.rb
class Kure
  # @param num [Integer]
  def initialize: (untyped num) -> untyped

  def run: () -> untyped

  def test: () -> 1
end

rbs prototype runtime

Rubyファイル(実行含)

class Kure
  # @param num [Integer]
  def initialize(num)
    raise "Parameter Invalid" unless num.is_a?(Integer)

    @num = num
  end

  def run
    @num
  end

  def test
    1
  end
end

kure = Kure.new(1)
puts kure.run
puts kure.test

RBS作成

  • ほとんど prototype rb と同様だが test メソッドは実装的には 1 を必ず返すが今回はその中身は解析されず、実行結果から内容を出力しているので untyped となっている
 % rbs prototype runtime -R test.rb Kure
1
1
class Kure
  public

  def run: () -> untyped

  def test: () -> untyped

  private

  def initialize: (untyped num) -> untyped
end

TypeProf

Rubyファイル(実行含)

rbs prototype runtimeと同じ

RBS作成

  • 引数と戻り値の型が推定されていて、出力にも記載されている
 % typeprof test.rb 
# Classes
class Kure
  @num: Integer

  def initialize: (Integer num) -> Integer
  def run: -> Integer
  def test: -> Integer
end

ちなみに以下のように返る戻り値の型が変動するメソッドの場合は、

  def test2
    @num == 1 ? 1 : "not 1"
  end

以下の内容が出力された。

def test2: -> (Integer | String)

参考

pocke.hatenablog.com

qiita.com