2013-08-01 2 views
2

Мне трудно найти ответ на этот вопрос.Может ли кто-нибудь объяснить, как «&» работает в этой ситуации?

Кто-то показал мне, как найти общие элементы в массиве:

> colours1 = %w(red green blue) 
> colours2 = %w(orange red black blue) 
> colours1 & colours2 
=> ["red", "blue"] 

Но я не понимаю, что такое «&» делает в этом коде, как это найти общие элементы?

ответ

2

Чтобы ответить какой это делает, я цитирую 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 сделать это. Но это должно дать вам представление о том, что происходит.

+0

Thats awesome. Спасибо за подробное объяснение. –

2

Потому что это определено так. Метод Array#& принимает другой массив и возвращает пересечение.

Смежные вопросы