Ruby 2.6 の変更点 - Enumerator と Enumerable

Ruby2.6アドベントカレンダーの6日目の記事です。

qiita.com

Enumerator

Enumerator#+, Enumerator#chain 追加

https://bugs.ruby-lang.org/issues/15144

Enumerator オブジェクトを結合した Enumerator::Chain オブジェクトを返します。

e = (1..3).each + [4, 5]          #=> #<Enumerator::Chain: [#<Enumerator: 1..3:each>, [4, 5]]>
e.to_a                            #=> [1, 2, 3, 4, 5]
e = (1..3).chain([4, 5], [6, 7])  #=> #<Enumerator::Chain: [1..3, [4, 5], [6, 7]]>
e.to_a                            #=> [1, 2, 3, 4, 5, 6, 7]

このために Enumerator::Chain クラスも追加されています。

Enumerator::ArithmeticSequence 追加

https://bugs.ruby-lang.org/issues/13904

Integer#step, Range#step が返すオブジェクトのクラスです。 2.5 までは Enumerator を返してました。

a = 1.step(10, 2)  #=> #<Enumerator::ArithmeticSequence>
a.begin            #=> 1
a.end              #=> 10
a.first(2)         #=> [1, 3]  # これは 2.5 から可能
a.last(2)          #=> [7, 9]
a.step             #=> 2

Enumerator::Lazy#filter 追加

https://bugs.ruby-lang.org/issues/13784

Enumerator::Lazy#filterEnumerator::Lazy#select の別名として追加されました。

Enumerable

Enumerable#chain 追加

https://bugs.ruby-lang.org/issues/15144

Enumerator#chain と同様です。

Enumerable#to_h にブロックを渡すとキーと値を変換できる

https://bugs.ruby-lang.org/issues/15143

Array#to_hHash#to_h と同様です。

(1..5).to_h{|x| [x, x**2]}  #=> {1=>1, 2=>4, 3=>9, 4=>16, 5=>25}

Enumerable#filter 追加

https://bugs.ruby-lang.org/issues/13784

Enumerable#filterEnumerable#select の別名として追加されました。