helen's blog

ずっとおもしろいことしてたいな。

rspecのエラーを集めてたらキーワード引数に出会いました

rspecのエラー出しまくってたのと
キーワード引数が素敵過ぎたのでまとめ

rspecで遭遇したエラーたち

引数の個数がおかしい問題
ArgumentError:
       wrong number of arguments (4 for 0)
  • 4が呼び出し側の引数の数、0がメソッド側の引数の数
  • メソッドの引数は0個なのに4個入ってるよ!状態
  • 引数の数を揃えれば解決
必要な引数が足りない問題
ArgumentError:
       missing keyword: id
  • 引数のidが入ってないよって言われてるだけ
引数がおかしい問題
ArgumentError:
       Missing required keyword arguments: id
  • キーワード引数なのに引数を渡す時にキーワード引数にしてなかった
  • キーワード引数に直す

キーワード引数とは

  • 引数に名前をつけれる
  • ruby 2.0から
  • 特定の引数だけ渡したりデフォルト値入れたりできる
# def メソッド名(変数名 : )
# def メソッド名(変数名 : デフォルト値)
def hoge_method(id:, hoge: "hoge", size: 10)
  # id, hoge, sizeで使える
end

# 呼び出す側
# デフォルト値がないものを未指定だとエラー
hoge_method(id:, hoge: "hoge", size: 10) # err

# デフォルト値入ってるものの上書き可能
hoge_method(id: 1, hoge: "hoge", size: 20)

# 一部の引数のみ指定でも可
# ただしデフォルト値がないものが抜けてるとエラー
hoge_method(id: 1)

# 順番入れ替え可
# ただしデフォルト値がないものが抜けてるとエラー
hoge_method(id: 1, size: 20, hoge: "hoge")

# 例
def get_items(id:, hoge: "fuga", size: 10) 
  Item.find(id)
end

get_items(id: 1)
get_items(id: 1, hoge: "piyo", size: 10)
get_items(id: 1, hoge: "piyo")
get_items(hoge: "piyo", id: 1)

わかりやすさと便利さはんぱない

ちなみに

# デフォルト値入ってないの指定し忘れちゃった
ArgumentError:
       missing keyword: id

# 存在しない引数を指定しちゃった
ArgumentError: 
       unknown keyword: no_such_keyword

になります

参考
キーワード引数 | TECHSCORE(テックスコア)
Ruby 2 Keyword Arguments
rkh.im | Ruby 2.1