Вы можете конвертировать хэши в sets и чем выполнить проверку с помощью методов subset?
и superset?
(или их соответствующие алиасы <=
и >=
):
require 'set'
hash.to_set.superset?({}.to_set)
# => true
hash.to_set >= {a: 1}.to_set
# => true
{a: 2}.to_set <= hash.to_set
# => false
Update: эталон предлагаемых решений:
require 'fruity'
require 'set'
hash = ('aa'..'zz').zip('aa'..'zz').to_h
# {"aa"=>"aa", "ab"=>"ab", ...
find = ('aa'..'zz').zip('aa'..'zz').select { |k, _| k[0] == k[1] }.to_h
# {"aa"=>"aa", "bb"=>"bb", ...
compare(
toro2k: -> { hash.to_set >= find.to_set },
MarekLipka: -> { hash.merge(find) == hash },
CarySwoveland: -> { (find.to_a - hash.to_a).empty? },
ArupRakshit: -> { arr = hash.to_a; find.all? { |pair| arr.include?(pair) } }
)
Результат:
Running each test 2 times. Test will take about 1 second.
MarekLipka is faster than toro2k by 3x ± 0.1
toro2k is faster than CarySwoveland by 39.99999999999999% ± 10.0%
CarySwoveland is faster than ArupRakshit by 1.9x ± 0.1
Мэтт, ты, кажется, были пожаловал с [смущения богатства] (Http: //dictionary.cambridge. орг/словарь/британец/ан-затруднение-оф князей). (Ссылка для тех, для которых английский является вторым языком.) Получение четырех из четырех качественных ответов на SO довольно редко. –