(a - b).empty?
работает, но - в зависимости от данных - это может быть не самый быстрый способ определить, содержит ли a
элемент, не входящий в b
. Например, была высока вероятность того, что каждый элемент a
не был в b
, в среднем, было бы быстрее проверить, находится ли a[0]
в b
, тогда (если это не так), если a[1]
находится в b
и так далее, останавливается, если и когда элемент находится в b
. Но опять же, это зависит от данных, в частности от вероятности того, что (a - b).empty?
равно true
. Если эта вероятность велика, Array # - , который записан в C, будет относительно быстрым и, вероятно, лучшим выбором.
С другой стороны, если его все, кроме определенного что a
будет содержать много элементов, которых нет в b
, может быть быстрее сделать что-то вроде следующего:
require 'set'
b_set = b.to_set
#=> #<Set: {4, 9, 7, 3}>
a.all? { |n| b_set.include?(n) }
В любом случае, вы можете сначала выполнить дешевый тест:
b.size < a.size
Если это так, то, безусловно, будет хотя бы один элемент из a
, которого нет в b
(при условии, что a
не содержит дубликатов).