Project

General

Profile

Actions

Feature #15976

closed

Add Array#overlap? for whether the intersection of 2 arrays is non empty?

Added by fcheung (Frederick Cheung) almost 2 years ago. Updated 24 days ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:93487]

Description

This is semantically equivalent to (ary1 & ary2).any?, but more efficient and makes the intent more obvious.

For example bundler checks whether the list of requested groups and the list of groups for a dependency has any overlap - it doesn't care what the overlap is, as long as it is non empty

In my personal projects we've found this to be a bottleneck when the arrays are large and where intersections are likely - !(ary1 & ary2).empty? keeps searching for all of the intersection even after we've found the first one, & creates extra garbage because of the intermediate array.

See https://github.com/ruby/ruby/pull/2260


Files

2260.patch (7.9 KB) 2260.patch fcheung (Frederick Cheung), 07/02/2019 09:02 PM

Related issues

Is duplicate of Ruby master - Feature #15198: Array#intersect?Closedmatz (Yukihiro Matsumoto)Actions
Actions #1

Updated by fcheung (Frederick Cheung) almost 2 years ago

  • Subject changed from Add Array#overlaps? for whether the intersection of 2 arrays is non empty? to Add Array#overlap? for whether the intersection of 2 arrays is non empty?
  • File 2260.patch added
Actions #2

Updated by fcheung (Frederick Cheung) almost 2 years ago

  • File deleted (2260.patch)

Updated by shevegen (Robert A. Heiler) almost 2 years ago

To me the name of the method appears to make sense and I am slightly in
favour of the suggestion. I can not say how useful this method would be
in general, though, mostly because I think I needed to do something
such as (array1 & array2).any? perhaps only once or twice in a long
time in my own code; but even then I think this might be a useful
proposal and a name that makes sense (to me at the least).

Actions #4

Updated by fcheung (Frederick Cheung) almost 2 years ago

Actions #5

Updated by fcheung (Frederick Cheung) almost 2 years ago

  • Description updated (diff)

Updated by fcheung (Frederick Cheung) almost 2 years ago

shevegen (Robert A. Heiler) wrote:

To me the name of the method appears to make sense and I am slightly in
favour of the suggestion. I can not say how useful this method would be
in general, though, mostly because I think I needed to do something
such as (array1 & array2).any? perhaps only once or twice in a long
time in my own code; but even then I think this might be a useful
proposal and a name that makes sense (to me at the least).

Thanks. Matz suggested today that the name was not so clear to him. An alternative that springs to mind would be intersect?, but I am obviously open to any suggestions

Updated by janosch-x (Janosch Müller) almost 2 years ago

I think this should be called intersect? for consistency with Set#intersect? and SortedSet#intersect?.

Updated by matz (Yukihiro Matsumoto) over 1 year ago

  • Status changed from Open to Feedback

I don't think overlap? is a good name. Besides that, Array#overlap? creates an internal hash table anyway, so that it wouldn't solve the bottleneck. In this case, creating a hash table explicitly would perform better.

Matz.

Actions #9

Updated by matz (Yukihiro Matsumoto) over 1 year ago

Actions #10

Updated by nobu (Nobuyoshi Nakada) 24 days ago

  • Status changed from Feedback to Closed

Applied in changeset git|b6bb4623ebcf1335cf0a81d279cde24a9e97bcce.


NEWS for [Feature #15198] [ci skip]

Actions

Also available in: Atom PDF