чтение исходного кода
VALUE
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
VALUE e;
for (i=0; i<RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
switch (rb_equal_opt(e, item)) {
case Qundef:
if (rb_equal(e, item)) return Qtrue;
break;
case Qtrue:
return Qtrue;
}
}
return Qfalse;
}
из https://ruby -doc.org / core-2.2.0 / Array.html # method-i-include-3F вы увидите, что ruby не использует ваш объектный оператор
РЕДАКТИРОВАТЬ: Как заявил Алексей-матюшкин (в комментариях), rb_equal_opt(e, item)
сравнивает указатели и возвращает true
Инвертируя его, вы можете нажать на него:
class Foo
def ==(other)
puts "yay"
true
end
end
> f = Foo.new
=> #<Foo:0x0000000001048610>
> [f].include?(f)
=> true
> [f].include?(f.dup)
yay
=> true