ブログ記事からの転載です。
以前から山のように提案があった Hash のショートハンドが RubyKaigi の感想戦で matz を説得して入ったらしい。
- チケット:[Feature #14579] Hash value omission
- コミット:https://github.com/ruby/ruby/commit/c60dbcd1c55cd77a24c41d5e1a9555622be8b2b8
- 感想戦のログ:https://hackmd.io/Mmse5ybASq-6c2kQoJQdMQ
これによって Ruby 3.1 で Hash が以下のように書くことができます。
name = "homu"
age = 14
# { name: name, age: age } のシンタックスシュガー
{ name:, age: }
# => {:name=>"homu", :age=>14}
# 一部だけ値を割り当てることもできる
{ name:, age: 16 }
# => {:name=>"homu", :age=>16}
def tokyo
"東京"
end
# メソッド呼び出しも可能
{ tokyo: }
# => {:tokyo=>"東京"}
def user(name:, age:)
{ name:, age: }
end
# user(name: name, age: age) になる
user(name:, age:)
めっちゃ便利ですね!!!!
このショートハンドは { a: } -> { a: a }
になるというよりかは a: -> a: a
になる、と認識するとよさそうです(なので [a:] -> [a: a]
となる。
matz を説得している時にちょうど離席していたのでどのような経緯で matz を説得したのかがすごく気になる…。
既に本体にコミットされているので rbenv install 3.1.0-dev
などで最新の Ruby を落としてくるとすぐに使えます。
今すぐ早く使いたい。
おまけ
感想戦で binding.local_variable_get(:if)
の変わりに {if:}[:if]
が使えるようになると言及されててワロタ
def foo(if:)
# if はキーワードなので変数にアクセスする時は Binding#local_variable_get を使う必要があった
if_ = binding.local_variable_get(:if)
# このショートハンドを使うとこうかけるようになる
if_ = {if:}[:if]
end
便利そう。