💎

Ruby 3.2 - Enumerator

2022/12/14に公開

Ruby 3.2 アドベントカレンダーの14日目の記事です。

https://qiita.com/advent-calendar/2022/ruby32


Enumerator

Enumerator::Product クラスと Enumerator.product メソッド追加

Feature #18685: Enumerator.product: Cartesian product of enumerables - Ruby master - Ruby Issue Tracking System

Array#product は自身の配列オブジェクトと引数の配列を組み合わせた配列の配列を返す。
こんな感じ:

[1,2,3].product([4,5])
#=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
[1,2].product([3,4],[5,6])
#=> [[1, 3, 5],
#    [1, 3, 6],
#    [1, 4, 5],
#    [1, 4, 6],
#    [2, 3, 5],
#    [2, 3, 6],
#    [2, 4, 5],
#    [2, 4, 6]]

Enumerator.product は配列だけじゃなくて Enumerable オブジェクトでこれと同じような動きをする。戻り値も配列じゃなくて Enumerator の一種の Enumerator::Product を返す。

e = Enumerator.product(1..3, [4,5])
#=> #<Enumerator::Product: ...>
e.to_a
#=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]

Enumerator.product()Enumerator::Product.new() と同じ。

e = Enumerator::Product.new(1..3, [4,5])
#=> #<Enumerator::Product: ...>
e.to_a
#=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]

Discussion