はじめに
バージョン
ruby 2.6.3
rails 5.2.3
キーワード付き引数についてよく理解していなかったのでハマりました。
イコールを使ってただのデフォルト値付きのメソッドを定義していたにも関わらず、メソッド呼び出しの際にキーワード付き引数の呼び出し方をしていた為、意図しない引数が渡っておりエラーが発生していた。
今回のミス
# デフォルト値付き引数でメソッドを定義
def hello(lang = "ja", place = "Japan")
puts "#{lang} : #{place}"
end
# キーワード付き引数の呼び出し方
hello(lang: "en", place: "America")
# =>
{:lang=>"en", :place=>"America"} : Japan
引数がハッシュとして解釈されて意図しない引数が渡ってしまった。
キーワード付き引数について
参考 https://qiita.com/jnchito/items/74e0930c54df90f9704c
def hello(lang: "ja", place: "Japan")
puts "#{lang} : #{place}"
end
# 引数なしの呼び出し
hello
# =>
ja : Japan
# キーワードありで引数の値を変更して呼び出し
hello(lang: "en", place: "America")
# =>
en : America
# キーワードのない引数で呼び出し
hello("en", "America")
# =>
wrong number of arguments (given 2, expected 0)
キーワード付き引数を持つメソッドを引数なしで呼び出すとデフォルト値でメソッドが呼び出される。
キーワードのない引数で呼び出そうとするとエラーが発生する。
デフォルト値を持つ引数について
参考 https://rooter.jp/programming/ruby_method_default/
def hello(lang = "ja", place = "Japan")
puts "#{lang} : #{place}"
end
# 引数なしの呼び出し
hello
# =>
"ja : Japan"
# キーワードのない引数で呼び出し
hello("en", "America")
# =>
en : America