Ruby 2.7 がリリース

例年どおり昨日 25日に Ruby 2.7 がリリースされました。

Ruby 2.7 の開発はだいぶ追っていたんですが追加された機能もあれば実装されたけど最終的に Revert されてしまった機能もあり割と起伏が激しい印象です。
なんだよ、最終的に Revert されたじゃん!!と気持ちが強かったんですが、実際リリースされるとやっぱり便利機能が多く追加されたので便利。
irb めっちゃ強くなったとかパターンマッチが(実験的に)実装されたとかキーワード引数めっちゃ警告出過ぎワロスみたいなのがあるんですが、地味にわたしが投げたパッチも取り込まれているのでいくつか紹介してみたいと思います。

Time#floor / Time#ceil

Time にはもともとミリ秒を丸める Time#round があったんですが、切り捨てと切り上げがなかったので追加しました。

time = Time.now

pp time            # => 2019-12-26 22:14:44.389964779 +0900
# 丸め込み
pp time.round(6)   # => 2019-12-26 22:14:44.389965 +0900
# 切り捨て
pp time.floor(6)   # => 2019-12-26 22:14:44.389964 +0900
# 切り上げ
pp time.ceil(6)    # => 2019-12-26 22:14:44.389965 +0900

自分で追加した程度にはめっちゃほしかったので Ruby 2.7 使いたい。

Refinements が method / instance_method に対応

Refinements の制限を緩和していこうキャンペーンで methodinstance_method でも Refinements で定義したメソッドを参照できるようにしました。

using Module.new {
  refine String do
    def twice
      self + self
    end
  end
}

# 2.7 では method や instance_method で Refinements で定義したメソッドが取得できるようになった
p "homu".method(:twice).call
p String.instance_method(:twice).bind("homu").call

便利。

その他個人的な注目機能

Ruby 2.7 ではいろいろな魅力的な機能が追加されているんですがその中でも個人的に「お、これめっちゃええやん!!」みたいなのをいくつか紹介してみます。

Time#inspect がミリ秒まで含まれるようになった

Time#inspect がミリ秒まで含まれるようになりました。

require "time"

time = Time.now

# 今まではミリ秒は切り捨てられていた
pp time
# => 2019-12-26 22:22:12 +0900

# ミリ秒まで表示する場合は iso8601 など使う必要があった
pp time.iso8601(10)
# => 2019-12-26 22:22:12.660985941 +0900

# Ruby 2.7 ではミリ秒まで表示されるようになった
pp time
# => 2019-12-26 22:22:12.660985941 +0900

一日に iso8601(10) って10000万回ぐらい書いているのでこれはありがたい…。

Method#inspectシグネチャと定義場所が含まれるようにあった

Method#inspectシグネチャと定義場所が含まれるようになりました。

def plus(a, b)
  a + b
end

# Ruby 2.6
p method(:plus)
# => #<Method: main.plus>

# RUby 2.7
p method(:plus)
# => <Method: main.plus(a, b) /tmp/test.rb/69:1>

ActiveRecord とか読む時にメソッドの定義場所を調べることは多かったんですが、定義場所の情報を取得する場合 Method#source_location を使う必要がありました。
source_location も今年100000億回ぐらい書いたのでもう書かなくていいのは便利ですね。

警告の制御

Ruby 2.7 ではキーワード引数で警告が出たり、新しい機能であるパターンマッチを使うと experimental であると警告が出るようになります。
この警告の出力を制御するために新しいオプションが追加されました。
例えば -W:no-deprecated を使用すればキーワード引数などの deprecated な警告が出力されなくなり、 -W:no-experimental を使用すればパターンマッチを使用した場合の警告などが出力されなくなります。
Ruby 2.7 を使いたいが外部ライブラリで警告が出てつらい、みたいな場合はこのオプションを利用してみるとよいです。

これからは

され、Ruby 2.7 が無事にリリースされたということはこれから Ruby 3.0 の開発が始まります。
Ruby 3.0 でも何かしら開発に貢献できていければいいかなーと思います。
とりあえず Refinements 周りのバグを見直していきたいですねえ…。

参照