キーだけしか書かない場合でも、勝手に値をnilにしてくれるかなと思ったけどそんなことはなかった。
キーだけしか書かない例
def foo(a:, b:123)
p a
p b
end
foo(b:456)
結果
4.rb:7:in `<main>': missing keyword: a (ArgumentError)
キーと値をどっちも書いた例
def foo(a:nil, b:123)
p a
p b
end
foo(b:456)
結果
nil
456
参考
パーフェクトRuby p.105 3-5-10 キーワード引数にも同じこと書いてあった。
def keywords(alice: nil, bob: nil)
{alice: alice, bob: bob}
end
keywords alice: 'アリス', bob: 'ボブ'
# => {:alice=>"アリス", :bob=>"ボブ"}
keywords
# => {:alice=>nil, :bob=>nil}
キーワード引数にはデフォルト値を指定する必要があります。上記の例では各キーワード引数に nil を指定していました。何かデフォルト値を指定してみましょう。
# デフォルト値は仮引数に直接指定する
def keywords(alice: 'ありす', bob: 'ぼぶ')
{alice: alice, bob: bob}
end
keywords bob: 'ボブ'
# => {:alice=>"ありす", :bob=>"ボブ"}