В стандартной библиотеке есть набор классов , и использование наборов точно соответствует вашим намерениям:
require 'set'
a = ['c','a','b']
aa = [['a','b','c'],['c','g'],['z','f','b']]
find_this = Set.new(a)
the_match = aa.find { |x| find_this == Set.new(x) }
Это оставит соответствующий элемент элемента aa
в the_match
,Если вас интересует только существование, вы можете просто проверить правдивость the_match
;или используйте any?
(спасибо за напоминание Майкла Коля, я часто забываю о некоторых вещах в Enumerable):
aa.any? { |x| find_this == Set.new(x) }
Нет трюков, нет магии, и использование Set делаетясно, что вы на самом деле сравниваете массивы как наборы.
Кстати, ваше попытанное решение:
guid_pairs.any? { |pair| pair.eql?(array_to_check) }
не работает, потому что массивы сравнивают поэлементноэлемент по порядку, поэтому два массива равны тогда и только тогда, когда они имеют одинаковые элементы в одном и том же порядке.Документация для eql?
может быть более понятной:
Возвращает true, если self и other являются одним и тем же объектом или являются массивами с одинаковым содержимым.
Но документация ==
хороша и понятна:
Два массива равны, если они содержат одинаковое количество элементов и если каждый элемент равен (согласно Object. ==) соответствующий элемент в другом массиве.
Мы можем посмотреть Object # eql? для некоторого пояснения:
Экл?Метод возвращает true, если obj и anObject имеют одно и то же значение.Используется Hash для проверки членов на равенство.Для объектов класса Object, eql?является синонимом ==.Подклассы обычно продолжают эту традицию, но есть исключения.
Так что ==
и eql?
должны вести себя одинаково, если нет веских причин для их отличия.