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 リファレンスマニュアル)