Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Hash.new مع القيم الافتراضية

جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 33 من 56.

بشكل افتراضي، البحث عن مفتاح مفقود في hash يعيد nil:

scores = {}
puts scores["Alice"]   # nil

Hash.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، يتم إضافة المفتاح بالقيمة الجديدة.

challenge icon

التحدي

سهل

اقرأ قائمة مفصولة بفاصلة من مدخلات 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق العمليات