以下の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
はその値を返すtest
は1
を固定で返す
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)