Note

3年後の自分のために書いています

Ruby 2.6 の変更点で個人的に気になったところをまとめておく

サンプルコードは参考リンクに豊富に載ってるので、ほぼ省略しています。

ローカル変数の shadowing 警告を削除

Effective Ruby の項目5で出てきたやつ、なくなったんですね。

to_h がブロックを受け取れるように

['Hoge', 'Fuga'].to_h { |x| [x.upcase, x.downcase] } みたいにブロック内で [key, value] となるような配列を返すと、それを要素としたハッシュが生成される。

Enumerable#chain, Enumerator#+

イテレータを連鎖させるやつ、便利そう。

Kernel#yield_self の別名に Kernel#then が導入された

そもそも Kernel#yield_self を知らなかった…レシーバをブロック引数として、ブロックの結果がそのまま返り値になるやつ。

Object#tap と似てるなーと思ったら、#tapself を返すんですね。

ref. instance method Object#tap (Ruby 2.6.0)

:exception オプションの導入

メソッドの実行失敗時に true なら例外を吐かせ、false なら nil を返す。

Array#union, Array#difference

これまで |- 演算子で実現していた配列の和集合と差集合を返すやつ、こちらは複数の引数を同時に取れる。

Hash#merge, Hash#merge! が複数の引数を受け取れるように

{k1: :v1}.merge({k2: :v2}).merge({k3: :v3}) と書かなくてよくなる。

String#split がブロックを受け取れるように

ブロック引数には分割された部分文字列が順に渡される。ブロックを使った場合、 #split メソッド自体の返り値はレシーバの文字列になるので注意が必要そう。

参考

プロと読み解く Ruby 2.6 NEWS ファイル - クックパッド開発者ブログ

サンプルコードでわかる!Ruby 2.6の主な新機能と変更点 - Qiita

ruby/NEWS at v2_6_0 · ruby/ruby · GitHub

Ruby 2.6.0 Released

おまけ

いろいろ調べてたら Ruby の Object クラスと Kernel モジュールの関係が曖昧になってきたので、ついでに整理。

以下の Kernel モジュールの要約がとてもよくまとまっている。

全てのクラスから参照できるメソッドを定義しているモジュール。 Object クラスはこのモジュールをインクルードしています。

Object クラスのメソッドは実際にはこのモジュールで定義されています。 これはトップレベルでのメソッドの再定義に対応するためです。

ref. module Kernel (Ruby 2.6.0)