Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby 3.1にArray#intersect?メソッドが追加(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

なお、Setクラスには以前からintersect?という共通集合の要素を返すメソッドがあります(Ruby 2.1)。

参考: Set#intersect? (Ruby 3.0.0 リファレンスマニュアル)

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))

関連記事

Rails 7のenumに新しい構文が導入(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。