كيف يمكنك اختبار مساواة التجزئة بسهولة في Ruby عندما تهتم فقط بمفاتيح التقاطع؟

StackOverflow https://stackoverflow.com/questions/1722421

سؤال

قل لي اجتياز ما يلي:

hash_x = {
  :a => 1,
  :b => 2
}
hash_y = {
  :b => 2,
  :c => 3
}

أحتاج إلى قطعة من المنطق التي تقارن الاثنين للمساواة مع الأخذ في الاعتبار مفاتيح تقاطع فقط.

في هذا المثال، فإن المفتاح "B" هو القواسم المشتركة الوحيدة بين التجزأتين ويتم تعيين القيمة على "2" على حد سواء من خلال هذا المنطق فسيتم اعتبار هذين التجزئين مساويا.

وبالمثل، لن يكون هذان التجزئين متساوين بسبب عدم المساواة في مفتاح "D" (يتم تجاهل القيم الرئيسية "A" و "C" لأنها فريدة من نوعها تجزئة كل منها):

hash_p = {
  :a => 1,
  :b => 2,
  :d => 3,
}
hash_q = {
  :b => 2,
  :c => 3,
  :d => 4
}

هل هناك بطانة ذكية واحدة في Ruby التي يمكنها حساب مفاتيح التقاطع في التجزئة بينهما ثم مقارنة قيمها للمساواة بناء على هذه المفاتيح؟

نقاط المكافأة إذا قمت بتوفير الاختبارات.

المزيد من نقاط المكافأة إذا كنت قد قردها في فئة التجزئة.

هل كانت مفيدة؟

المحلول

def compare_intersecting_keys(a, b)
  (a.keys & b.keys).all? {|k| a[k] == b[k]}
end

استخدام مثل هذا:

compare_intersecting_keys(hash_x, hash_y)  # => true
compare_intersecting_keys(hash_p, hash_q)  # => false

إذا كنت تريد ذلك قرد مصححة:

class Hash
  def compare_intersection(other)
    (self.keys & other.keys).all? {|k| self[k] == other[k]}
  end
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top