التكرار عبر الـ Hashes
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 34 من 56.
تعد جداول التجزئة (Hashes) قابلة للتعداد (enumerable)، لذا يمكنك التكرار عليها تماماً مثل المصفوفات. هناك ثلاثة أنماط شائعة، اعتماداً على ما تريده.
each تمنحك كلاً من المفتاح والقيمة:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key يمر عبر المفاتيح فقط:
prices.each_key { |k| puts k } # apple, bread, milkeach_value يمر على القيم فقط:
prices.each_value { |v| puts v } # 1, 3, 4وكل أساليب Enumerable التي رأيتها في الفصل السابق، map و select و reduce: تعمل على الـ hashes أيضاً. ستتلقى ببساطة زوجاً من المفتاح/القيمة (أو مصفوفة من عنصرين) لكل تكرار:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}التحدي
متوسطأنت تقوم بتطبيق تخفيضات على قائمة أسعار. الـ hash المسمى prices معطى (رمز العنصر item symbol => سعر صحيح price integer).
اقرأ سطراً واحداً من المدخلات: قائمة مفصولة بفاصلة من العناصر التي سيتم تخفيض سعرها بنسبة 50% (تطابق الرموز الموجودة في الـ hash، حسب الاسم).
اطبع، بهذا الترتيب:
- سطر واحد لكل عنصر بتنسيق
<item>: <item>: $<final_price>lt;final_price>، حيث يكون السعر النهائي هو القيمة المخفضة عندما يكون العنصر في قائمة التخفيض، أو القيمة الأصلية بخلاف ذلك. استخدمeachللتكرار. تحتفظ العناصر بترتيبها الأصلي. استخدم القسمة الصحيحة للتخفيض (price / 2). Was: Was: $<n>lt;n>: المجموع الأصلي (استخدمvalues.sum)Now: Now: $<n>lt;n>: المجموع بعد التخفيض- أسماء العناصر التي لا يزال سعرها النهائي أعلى من
2، مدمجة بـ,(استخدمselect+keysعلى الـ hash الجديد)
للمدخلات bread,milk مع الـ hash الافتراضي، تكون المخرجات:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseورقة مرجعية
التكرار عبر الـ hashes باستخدام each، و each_key، و each_value:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }تعمل دوال Enumerable مثل map، و select، و reduce أيضاً على الـ hashes، حيث تستقبل زوجاً من المفتاح/القيمة (key/value) في كل تكرار:
prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }دوال hash مفيدة: .values.sum لجمع كل القيم، و .keys للحصول على مصفوفة من المفاتيح.
جرّب بنفسك
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# مهام: بناء جدول (hash) السعر النهائي باستخدام each؛ طباعة الأسطر، المجاميع، والعناصر الغالية
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipeline