今日は Ruby 2.6 がリリースされる日!!

今日は年に一度の Ruby がリリースされる日ですね!!!
クリスマス?知らないですねえ…。

と、言うことで Ruby 2.6 が無事にリリースされました。やったー!

そんなわけで気になった機能をいくつか上げてみようかと思います。
ちなみに Ruby 2.6 にパッチを10個ぐらい投げた結果 4つ取り込まれました。わーい。

Kernel#thenKernel#yield_selfエイリアスとして追加

Kernel#yield_selfエイリアスとして Kernel#then が新しく追加されました。
yield_selfthen と短く書けるやったー、と思う一方 then って名前はどうなんですかね…という思いもあり…。
まあ文字数が半分以下になるのは喜ばしいこと。

Enumerable#filter Enumerable#filter! が追加

Enumerable#selectエイリアスとして Enumerable#filter が追加されました。
これで同機能の Enumerable の絞り込みメソッドが

  • Enumerable#select
  • Enumerable#find_all
  • Enumerable#filter

の3つに増えました。
知らない人から見るとますます混乱しそうな気もしますが…。
Ruby をやり始めた頃は『なんで filter がないんだよ』と思っていた思い出。

Proc#<<Proc#>> が追加

Proc にはいわゆる関数合成を行う演算子が新しく追加されました。

f = proc{|x| x + 2}
g = proc{|x| x * 3}
p (f << g).call(3) # -> 11; identical to f(g(3))
p (f >> g).call(3) # -> 15; identical to g(f(3))

f << gf(g()) になり、f >> gg(f()) になります。
また、Method にも同等の演算子が追加されています。

f = proc{|x| x + 2}
g = proc{|x| x * 3}

p (1.method(:+) << 2.method(:*)).call(3)  # => 7  (1 + (2 * 3))
p (1.method(:+) >> 2.method(:*)).call(3)  # => 8  ((1 + 3) * 2)

# Proc と組み合わせたり
p (1.method(:+) << g).call(3)   # => 10  ((3 * 3) + 1)
p (f >> 2.method(:+)).call(3)   # => 7   ((3 + 2) + 2)

Proc#<<Proc#>> ともに『#call が定義されている』オブジェクトを渡すことが出来ます。

class G
    def call x
        x * 3
    end
end

f = proc{|x| x + 2}
g = G.new
p (f << g).call(3)  # => 11  f(g(3))

所感

と、いう感じで少しですが Ruby 2.6 の機能を取り上げてみました。
他には終端なし Range が追加されたり #to_h にブロック引数が追加されたりなどなど。
気になる方はリリースノートを見てみるといいともいます。
さて、Ruby 2.6 がリリースされたということは Ruby 2.7 の開発が始まったことになります。
Ruby 2.6 ではパッチを10個投げた結果 4つ取り込まれました。
Ruby 2.7 でもまだまだ追加したい機能がたくさんあるので、Ruby 2.7 ではもう少しがんばってパッチを投げていきたいと思います。
あと直せる範囲であればバグ修正とかも手伝えるといいですねえ…。
そんな感じで来年も Ruby 2.7 を楽しみにしています!!