كيف يمكنك اختبار مساواة التجزئة بسهولة في Ruby عندما تهتم فقط بمفاتيح التقاطع؟
-
19-09-2019 - |
سؤال
قل لي اجتياز ما يلي:
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
لا تنتمي إلى StackOverflow