Чтобы ответить какой это делает, я цитирую the documentation of Array#&
:
Set Intersection - возвращает новый массив, содержащий элементы, общие для два массива, за исключением каких-либо дубликатов. Порядок сохраняется от исходного массива.
Как как он это делает, я укажу вам на rubinius implementation of Array#&
:
def &(other)
other = Rubinius::Type.coerce_to other, Array, :to_ary
array = []
im = Rubinius::IdentityMap.from other
each { |x| array << x if im.delete x }
array
end
Использование each { |x| array << x if im.delete x }
только элементы, являющиеся в self
(первый массив) добавляются в возвращаемый массив , если они включены в массив other
.
Пожалуйста, обратите внимание, что с-рубиновый реализует вещи немного разные, чем Rubinius или JRuby сделать это. Но это должно дать вам представление о том, что происходит.
Thats awesome. Спасибо за подробное объяснение. –