Ruby 2.7 の変更点 - 復活したものや入りそうで入らなかったもの

Ruby 2.7 アドベントカレンダーの1日目の記事です。

qiita.com

Ruby は毎年クリスマスにバージョンが上がります。 今年も順調にいけば 12/25 に Ruby 2.7 がリリースされる予定です。

2.7 がリリースされるまで毎日少しずつ変更点を見ていきます。 ソースは NEWS(とか git log とか)です。

Ruby 2.7 までに復活したもの

キーワード引数のハッシュのシンボルでないキー

Ruby 2.6.0 で キーワード引数のハッシュのキーがシンボルでない場合はエラーになったんですが、2.6.2 でその挙動が取り消されてエラーにならなくなりました。 2.7 でもエラーにならないのですが、少し挙動が異なります。

def hoge(*a, **k)
  p a
  p k
end

# Ruby 2.5
hoge("a"=>1, b: 2)
#=> [{"a"=>1}]
#=> {:b=>2}

# Ruby 2.6.0
hoge("a"=>1, b: 2)
#=> non-symbol key in keyword arguments: "a" (ArgumentError)

# Ruby 2.6.2
hoge("a"=>1, b: 2)
#=> [{"a"=>1}]
#=> {:b=>2}

# Ruby 2.7
hoge("a"=>1, b: 2)
#=> []
#=> {"a"=>1, :b=>2}

flip-flop 構文

2.6.0 で flip-flop が非推奨になり warning が出力されるようになったのですが、2.6.4 で復活しました。 実は結構使われてたってことみたいです。

# Ruby 2.5
10.times{|i| print i if (i==3)..(i==6)}
#=> "3456"

# Ruby 2.6.0
10.times{|i| print i if (i==3)..(i==6)}
#=> warning: flip-flop is deprecated
#=> "3456"

# Ruby 2.6.4
10.times{|i| print i if (i==3)..(i==6)}
#=> "3456"

# Ruby 2.7
10.times{|i| print i if (i==3)..(i==6)}
#=> "3456"

Ruby 2.7 で入りそうだったけど入らなかったもの

パイプライン演算子

. と同じ働きをするけど . よりも結合の優先度が低い |> という演算子が入るかも…という話があったんですが結局入りませんでした。 2.7.0-preview1 から preview2 までの間に導入&削除されてます。

メソッド参照演算子

メソッドオブジェクトを取得する .: 演算子が 2.7.0-preview1 で入ったのですが、2.7.0-preview3 で削除されました。 method メソッドで同様のことは可能です。

# Ruby 2.7.0-preview1
"123".:to_i
#=> #<Method: String#to_i>

# Ruby 2.7.0-preview3
"123".:to_i
#=> syntax error, unexpected symbol literal
"123".method(:to_i)
#=> #<Method: String#to_i(*)>