Hash.new مع القيم الافتراضية
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 33 من 56.
بشكل افتراضي، البحث عن مفتاح مفقود في hash يعيد nil:
scores = {}
puts scores["Alice"] # nilHash.new(default) يغير ذلك. كل مفتاح مفقود يعيد القيمة التي قمت بتمريرها:
scores = Hash.new(0)
puts scores["Alice"] # 0هذه هي الطريقة الأنظف لكتابة عداد. لا تحتاج إلى التحقق من if scores[name].nil? قبل الزيادة:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}هام: Hash.new(0) يضبط القيمة الافتراضية على 0 ولكن لا يقوم بتخزين المفتاح عند قراءته. يظل الـ hash فارغاً حتى تقوم بالتعيين. لذا بمجرد كتابة counts[letter] += 1، يتم إضافة المفتاح بالقيمة الجديدة.
التحدي
سهلاقرأ قائمة مفصولة بفاصلة من مدخلات category:amount (على سبيل المثال food:12,gas:30,food:8,books:25,gas:15). قم ببناء hash لـ totals per category باستخدام Hash.new(0)، ثم اطبع فقط الفئات التي يبلغ مجموعها 20 على الأقل، فئة واحدة في كل سطر، مرتبة حسب المجموع تنازلياً:
<category>: <total>بالنسبة لمدخلات المثال أعلاه، يكون المخرج هو:
gas: 45
books: 25
food: 20إذا لم تصل أي فئة إلى 20، فلا تطبع شيئاً.
ورقة مرجعية
بشكل افتراضي، تعيد مفاتيح الـ hash المفقودة nil. استخدم Hash.new(default) لإعادة قيمة افتراضية مختلفة بدلاً من ذلك:
scores = Hash.new(0)
puts scores["Alice"] # 0هذا يجعل العدادات نظيفة — لا حاجة للتحقق من nil قبل الزيادة:
counts = Hash.new(0)
["a", "b", "a"].each do |letter|
counts[letter] += 1
end
# {"a"=>2, "b"=>1}ملاحظة: قراءة مفتاح مفقود لا تقوم بتخزينه. يتم إضافة المفتاح فقط بمجرد تعيين قيمة (على سبيل المثال +=).
جرّب بنفسك
entries = gets.chomp.split(",")
# TODO: totals = Hash.new(0); تجميع المبلغ لكل فئة;
# ثم طباعة الفئات التي يكون مجموعها >= 20، مرتبة حسب total تنازلياً desc
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
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