Hashes מקוננים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 35 מתוך 56.
ערך hash יכול להיות בעצמו hash. צורה מקוננת זו היא הדרך שבה קוד Ruby מייצג בדרך כלל רשומות מובנות: hash יחיד שמפתחיו הם מזהים (או שמות), כאשר כל ערך מכיל שדות משלו:
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}כדי להגיע לערך מקונן, שרשרו את החיפושים:
puts students["Alice"][:age] # 20
puts students["Bob"][:grade] # Bהוספת שדה חדש לאחת מהמפות הפנימיות פועלת באותו אופן:
students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}כדי לקרוא בבטחה מתוך גיבוב מקונן שעשוי להיות חסר בו מפתח בכל רמה, dig עובר לאורך השרשרת ומחזיר nil אם משהו חסר בדרך:
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilאתגר
בינונינתון hash מקונן בשם inventory: כל מפתח ברמה העליונה הוא מחלקה, כל מפתח פנימי הוא פריט, וכל ערך פנימי הוא הכמות במלאי (מספר שלם).
קראו שורת קלט אחת: רשימה מופרדת בפסיקים של נתיבי חיפוש בפורמט department/item.
עבור כל נתיב, לפי הסדר, השתמשו ב־dig כדי למצוא את הערך. הדפיסו אחת מהאפשרויות הבאות:
<department>/<item>: <qty>כאשר הנתיב קיים<department>/<item>: missingכאשרdigמחזירהnil
לאחר הדפסת כל השורות, הדפיסו גם שורת סיכום אחת:
Total inventory: <sum>הסכום הכולל הוא סכום כל הכמויות בכל המחלקות ב־hash המקורי. השתמשו באיטרציה מקוננת (כל מחלקה, ואז כל פריט).
עבור הקלט fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk, הפלט הוא:
fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39נסו בעצמכם
inventory = {
fruits: { apples: 12, bananas: 4 },
meat: { beef: 7, chicken: 5 },
dairy: { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")
# TODO: עבור כל חיפוש, השתמשו ב-dig והדפיסו את qty או 'missing'.
# לאחר מכן הדפיסו 'Total inventory: <sum>' עבור כל הפריטים.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
סקירה של מתודות למחרוזותאינטרפולציה של מחרוזותמעבר על מחרוזותפיצול וחיבורסיכום – שוזר המחרוזות4בלוקים, Procs ו־Lambdas
מהו בלוק?do..end לעומת סוגריים מסולסליםמילת המפתח yieldפרמטרים של בלוקProcs ו־Lambdasסיכום – איטרטור מותאם אישית7Hashes חלק 2
Hash.new עם ערכי ברירת מחדלמעבר על HashesHashes מקונניםמיזוג ושינויסיכום - מונה תדירויות10פרויקט - רשומות תלמידים
סקירת הפרויקטהוספת תלמיד5עוצמת Enumerable
Select ו־Rejectשרשור MapReduce / Injectcount, all?, any?, none?group_by ו־partitionsort_by, min_by, max_byסיכום - צינור נתוניםתרגלו בעצמכם: קומפיילר Ruby אונליין