РЕДАКТИРОВАТЬ: Я одобряю Марк Томас ' альтернативное решение, которое использует ядро Set
класс .
В то время как мое решение более строгоОтвечая на вопрос о том, как сделать это с массивами, sjsc может извлечь пользу из рассмотрения его собственного случая и изучения возможности использования наборов вместо этого.
Существует множество веских причин для использования массивов (поддержание порядка, позволяющеедля дубликатов), для которых все еще достаточно нижеследующего, но если ни один из них не задействован, sjsc может выиграть от использования Set вместо Array, и в этом смысле решение Марка семантически лучше.
Я не знаю ни одного библиотечного метода, который бы делал это, но было бы не сложно написать свою собственную функцию.
class Array
def subset?(a)
(self - a).length == 0
end
end
Я уверен, что есть вычислительно более эффективные способы сделать это,но это должно сделать то, что вы ищете.
Выполнение пересечения массива работает и в основном равносильно тому же.
class Array
def subset?(a)
(self & a).length == length
end
end
Оптимизацияна этом уровне не слишком поможет, но вы не хотите начинать сравнивать массивы несколько раз:
class Array
# don't do this
def subset?(a)
(self & a) == a
end
end