Method: Array#&
- Defined in:
- array.c
#&(other_array) ⇒ Object
Returns a new array containing the intersection of self
and other_array
; that is, containing those elements found in both self
and other_array
:
[0, 1, 2, 3] & [1, 2] # => [1, 2]
Omits duplicates:
[0, 1, 1, 0] & [0, 1] # => [0, 1]
Preserves order from self
:
[0, 1, 2] & [3, 2, 1, 0] # => [0, 1, 2]
Identifies common elements using method #eql?
(as defined in each element of self
).
Related: see Methods for Combining.
5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 |
# File 'array.c', line 5646
static VALUE
rb_ary_and(VALUE ary1, VALUE ary2)
{
VALUE hash, ary3, v;
st_data_t vv;
long i;
ary2 = to_ary(ary2);
ary3 = rb_ary_new();
if (RARRAY_LEN(ary1) == 0 || RARRAY_LEN(ary2) == 0) return ary3;
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN && RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
if (!rb_ary_includes_by_eql(ary2, v)) continue;
if (rb_ary_includes_by_eql(ary3, v)) continue;
rb_ary_push(ary3, v);
}
return ary3;
}
hash = ary_make_hash(ary2);
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
vv = (st_data_t)v;
if (rb_hash_stlike_delete(hash, &vv, 0)) {
rb_ary_push(ary3, v);
}
}
return ary3;
}
|