Ruby 3.1にArray#intersect?メソッドが追加(翻訳)
Rubyで配列を扱っていると、配列同士の交差(intersection)が欲しくなることがよくあります。
2019年のブログ記事ではArray#intersectionというメソッドを取り上げました。これは以下のように、配列同士に共通する要素を配列で返します。
a = [1, 2, 3]
b = [2, 3, 5, 7]
c = [5, 3, 8, 7]
a.intersection(b)
#=> [2, 3]
a.intersection(b, c)
#=> [3]
しかし、配列同士の交差そのものではなく、交差があるかかどうかだけを知りたいときもあります。
改修前
Ruby 3.1より前は、結果をtrueまたはfalseで得るために、intersectionメソッドに#any?メソッドまたは#empty?メソッドをチェインします。
a = [1, 2, 3]
b = [2, 3, 5, 7]
a.intersection(b).any?
#=> true
a.intersection(b).empty?
#=> false
この方法では、配列同士の交差結果を出してから#any?や#empty?で評価しています。
改修後
メモリ削減およびパフォーマンス向上のため、Ruby 3.1にArray#intersect?メソッドが追加されました(#1972)。Array#intersect?は、2つの配列に共通要素が1個でもあればtrueを返し、なければfalseを返します。
a = [1, 2, 3]
b = [2, 3, 5, 7]
c = [4, 7, 9]
a.intersect?(b)
#=> true
a.intersect?(c)
#=> false
メモ
#intersectionメソッドは引数に複数の配列を渡せますが、#intersect?メソッドの引数には複数の配列を渡せません。
a.intersect?(b, c)
#=> ArgumentError (wrong number of arguments (given 2, expected 1))
概要
原著者の許諾を得て翻訳・公開いたします。
なお、
Setクラスには以前からintersect?という共通集合の要素を返すメソッドがあります(Ruby 2.1)。参考:
Set#intersect?(Ruby 3.0.0 リファレンスマニュアル)