【一人 bugs.ruby Advent Calendar 2021】[Feature #14579] Hash value omission【7日目】

一人 bugs.ruby Advent Calendar 2021 7日目の記事になります。
今回は { x:, y: }{ x: x, y: y } のショートハンドにする提案です。

[Feature #14579] Hash value omission

{ x:, y: }{ x: x, y: y } のショートハンドにする提案です。
これ以外にも似たような提案は無限にされていたけど matz を説得できずに長年入っていなかった経緯があります。
しかし、今年の RubyKaigi の感想戦でこれに関する議論がされて、matz を説得して無事に accepts されました!やったー! これは以下のように x:x: x に展開するようなシンタックスシュガーになります。

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:)


# 現時点では定数も展開できる
X = 42
{ X: }
# => {:X=>42}

現状は { X: } みたいな定数も展開されるがもしかしたらリリース時点でまた仕様が変わっている可能性があるので注意(そういえばこれはこのままいくんですかね? ちなみにこれを利用すると予約語と同名の変数に対して高速にアクセスする事ができます。

def foo(if:)
  # if はキーワードなので変数にアクセスする時は Binding#local_variable_get を使う必要があった
  if_ = binding.local_variable_get(:if)

  # このショートハンドを使うとこうかけるようになる
  if_ = {if:}[:if]
end

いやーこれすごく欲しかったので Ruby 3.1 で使えるようになっためっちゃいいですね。
早く Ruby 3.1 使いたい。