Ruby 3.1 で { a: a } が { a: } とかけるようになるらしい
以前から山のように提案があった 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
便利そう。