Ну, ^ это Xor метод.
1 ^ 1 = 0,
1 ^ 1 ^ 1 = 0 ^ 1 = 1,
1 ^ 2 = binary(01) ^ binary(10) = binary(11) = 3
Таким образом, с помощью Reduce вы пересекаете массив и применяете операцию xor.
Итак, результат xor элементов, который встречается четное время, равен 0, а результатом xor элементов, который встречается нечетное время, является сам элемент.
Итак, общий результат xor - это элемент, который встречается нечетное время.
Например, у вас есть arr = [2, 3, 3, 5, 2, 7, 5]
Когда вы звоните arr.reduce(:^)
, он работает аналогично следующим образом:
((((((2 ^ 3) ^ 3) ^ 5) ^ 2) ^ 7) ^ 5)
Тогда xor удовлетворяет коммутативному закону и ассоциативному закону, поэтому он эквивалентен следующему
(2 ^ 2) ^ (3 ^ 3) ^ (5 ^ 5) ^ 7 = 0 ^ 0 ^ 0 ^ 7 = 7
Итак, вы найдете ответ 7