概要
- キーワード引数を受け取るメソッドなのに、ハッシュを渡していても、今までは特に何も怒られなかった
- キーワード引数を受け取るメソッドには、キーワード引数を渡すようにすること
- 二つの違いが、Rubyの古いバージョンでは曖昧だった (なんか曖昧だなとは思っていた)
キーワード引数を受け取るメソッド
def foo(x:, y:)
end
キーワード引数での呼び出しの例
メソッド実行の引数に直接 key / value を書く
foo(x: "x", y: "y")
ハッシュでの呼び出しの例
メソッド実行の引数をブレースで囲って key / value を書く
(ブレースで囲うものが、そもそも Hash なので)
この書き方はNGとなる
foo({x: "x", y: "y"})
ハッシュをキーワード引数として渡したい場合
ダブルアスタリスクを付けると、ハッシュをキーワード引数に変換してメソッドに渡せる
foo(**{x: "x", y: "y"})
この例だと全く意味はないが、ハッシュが変数の場合は有用
hash = {x: "x", y: "y"}
foo(**hash)
逆パターン
ハッシュを受け取るメソッドでは
def bar(h = {})
end
ハッシュを引数にできる
bar({ x: "x", y: "y" })
キーワードも引数にできる
bar(x: "x", y: "y")
曖昧さが残ったままだが、このパターンはRuby3 になっても使い続けられるらしい
他の例
公式を参照
要するに曖昧さがなくなればOK
Code
# receive keyword args method
def foo(x:, y:)
p x
p y
end
# OK
# Pass keyword args
foo(x: "x", y: "y")
# OK
# Pass hash but convert as keyword args explicity
foo(**{x: "x", y: "y"})
# OK
# Pass hash but convert as keyword args explicity
hash = {x: "x", y: "y"}
foo(**hash)
# NG
# Pass Hash Args
# warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
foo({x: "x", y: "y"})
# Receive hash method
def bar(h = {})
p h[:x]
p h[:y]
end
# OK
bar({ x: "x", y: "y" })
# OK
# Call with keyword argus but NO ERROR!
bar(x: "x", y: "y")
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。