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 の制限を緩和していこうキャンペーンで method
と instance_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 周りのバグを見直していきたいですねえ…。