2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-05-01

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

チャットメンバー募集

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

Twitter

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?