Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →
instance method
Array#-
(::array[untyped] other_array) -> ::Array[Elem]
self - other_array → new_array
array.c
View on GitHub ↗
VALUE
rb_ary_diff(VALUE ary1, VALUE ary2)
{
ary2 = to_ary(ary2);
if (RARRAY_LEN(ary2) == 0) { return ary_make_shared_copy(ary1); }
VALUE ary3 = rb_ary_new();
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN || RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
for (rb_len_t i = 0; i < RARRAY_LEN(ary1); i++) {
VALUE elt = rb_ary_elt(ary1, i);
if (rb_ary_includes_by_eql(ary2, elt)) continue;
rb_ary_push(ary3, elt);
}
return ary3;
}
VALUE set = ary_to_set(ary2);
for (rb_len_t i = 0; i < RARRAY_LEN(ary1); i++) {
if (rb_set_lookup(set, RARRAY_AREF(ary1, i))) continue;
rb_ary_push(ary3, rb_ary_elt(ary1, i));
}
return ary3;
}
Returns a new array containing only those elements of self that are not found in other_array; the order from self is preserved:
Example
[0, 1, 1, 2, 1, 1, 3, 1, 1] - [1] # => [0, 2, 3] [0, 1, 1, 2, 1, 1, 3, 1, 1] - [3, 2, 0, :foo] # => [1, 1, 1, 1, 1, 1] [0, 1, 2] - [:foo] # => [0, 1, 2]
Element are compared using method eql? (as defined in each element of self).
Related: see Methods for Combining.