Ruby 2.7 の変更点 - 2.7.0-rc2

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

qiita.com

12/21 に 2.7.0-rc2 が出たので rc1 との NEWS の差分を見てみました。

Array#minmax 追加

2.6 では Array#minmaxEnumerabe#minmax を継承していたのですが、Array に実装されました。

[1, 5, 20].minmax                         #=> [1, 20]
[1, 5, 20].minmax{ _1.to_s <=> _2.to_s }  #=> [1, 5]

高速になったようです。

require 'benchmark'
a = 10000000.times.map { rand(1000000) }
puts Benchmark.measure { a.minmax }

# 2.6
#=>  0.281553   0.000040   0.281593 (  0.281675)

# 2.7
#=>  0.060905   0.000035   0.060940 (  0.061017)

2.7.0-preview2 で実装されていたのですが、NEWS の記述から漏れていたのが追記されたようです。

Range#minmax 追加

Array#minmax と同様に Range に実装されました。

require 'benchmark'
r = (1..1000000)
puts Benchmark.measure { r.minmax }

# 2.6
#=>   0.025841   0.000000   0.025841 (  0.026052)

# 2.7
#=>   0.000005   0.000002   0.000007 (  0.000005)

これも実装は 2.7.0-preview2 です。

Proc#ruby2_keywords 追加

Module#ruby2_keywords の Proc 版です。

fuga = ->(*args, **kw) do
  args
  kw
end

hoge = ->(*args) do
  fuga.call(*args)
end

hoge.call(k: 123)
#=> test.rb:6: warning: The last argument is used as keyword parameters; maybe ** should be added to the call
#=> test.rb:1: warning: The called method `call' is defined here

# ruby2_keywords を指定すると warning が抑止される
hoge.ruby2_keywords
hoge.call(k: 123)

2.7.0-rc1 で追加されてましたが、NEWS の記述から漏れていたのがに追記されました。