余談:Ruby3キーワード引数の変更
Ruby2では「最後の引数=キーワード引数」だった
Ruby3ではこれらが禁止される予定!
• キーワード引数はキーワード引数として受け渡ししよう
• オプショナル引数はハッシュとして受け渡ししよう
3
def foo(kw: 1); end
foo(kw: 42)
def foo(kw:1); end
foo(**hash)
def foo(kw: 1)
end
foo({ kw: 42 })
def foo(kw: 1)
end
foo(hash)
Slide 4
Slide 4 text
余談:Ruby2.7のキーワード引数
•直すべきメソッド呼出しにレベル1警告が出ます
• 詳細な案内は追ってどこかに書きます
• まだ詳細な仕様が決まっていない(委譲を調整中)
• Railsはだいたい対応済み (!?)
4
def foo(kw: 1)
end
foo({ kw: 42 })
test.rb:3: warning: The last argument is used as the keyword parameter
test.rb:1: warning: for `foo' defined here
1. 型シグネチャフォーマット(.rbs)
Rubyコードの型情報を示す標準形式
9
class Array[X] < Object
include Enumerable
def []: (Integer) -> X?
def []=: (Integer, X) -> X
def each: () { (X) -> void } -> Array[X]
...
end
組み込みメソッドの.rbsをRuby 3に同梱予定
コントリビューションチャンス!
github.com/ruby/ruby-signature
Slide 10
Slide 10 text
2. 型シグネチャなし検査+推定
無注釈コードの緩い型検査+型シグネチャ推定
def foo(n)
n + "s"
end
def bar(n)
ary = [1, "S"]
ary[n]
end
foo(gets.to_i)
bar(gets.to_i)
10
型プロファイラ開発中
github.com/mame/ruby-type-profiler
def bar:
(Int) -> (Int | Str)
TypeError: failed to
resolve Integer#+(String)
mruby 向けには mruby-meta-circular も
Slide 11
Slide 11 text
3. 型シグネチャあり型検査
型シグネチャとコードの整合性を検査する
class Foo
def foo(s)
s + 42
end
def bar(s)
s.gsuub(//,"")
end
end
class Foo
def foo:(Str)->Int
def bar:(Str)->Int
end
11
TypeError!
Str + Int
NoMethod
Error!
Steep github.com/soutaro/steep
Sorbet github.com/sorbet/sorbet
整合?