🖥

#Ruby 2.7 でキーワード引数とハッシュの自動変換が非推奨になった ( deprecated hash and keyword arg

に公開

Ruby 2.7.0 リリース

概要

  • キーワード引数を受け取るメソッドなのに、ハッシュを渡していても、今までは特に何も怒られなかった
  • キーワード引数を受け取るメソッドには、キーワード引数を渡すようにすること
  • 二つの違いが、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 になっても使い続けられるらしい

他の例

公式を参照

Ruby 2.7.0 リリース

要するに曖昧さがなくなれば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

https://github.com/YumaInaura/YumaInaura/issues/3103

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2020-05-01

Discussion