Posted at

キーワード引数の引数にキーだけしか書かないとArgumentError

More than 3 years have passed since last update.

キーだけしか書かない場合でも、勝手に値を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=>"ボブ"}