Ruby 3.1 で { a: a } が { a: } とかけるようになるらしい

以前から山のように提案があった Hash のショートハンドが RubyKaigi の感想戦で matz を説得して入ったらしい。

これによって 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

便利そう。