Menu
Coddy logo textTech

מעבר על Hashes

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 34 מתוך 56.

Hash-ים ניתנים לסריקה, כך שאפשר לעבור עליהם בדיוק כמו על מערכים. יש שלוש תבניות נפוצות, בהתאם למה שרוצים.

each מספקת לך גם את המפתח וגם את הערך:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key עובר רק על המפתחות:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value עובר רק על הערכים:

prices.each_value { |v| puts v }   # 1, 3, 4

וכל המתודות של Enumerable שראית בפרק הקודם, map, select, reduce: פועלות גם על hashes. בכל איטרציה פשוט מקבלים זוג מפתח/ערך (או מערך בן 2 איברים):

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

אתגר

בינוני

אתם מחילים מבצע על מחירון. המילון prices נתון (סמל הפריט => מספר שלם של מחיר).

קראו שורת קלט אחת: רשימה מופרדת בפסיקים של פריטים שעליהם תינתן הנחה של 50% (התאמה לסמלים במילון, לפי שם).

הדפיסו, לפי הסדר הזה:

  1. שורה אחת לכל פריט בפורמט <item>: $<final_price>, כאשר המחיר הסופי הוא הערך לאחר ההנחה אם הפריט נמצא ברשימת ההנחות, או הערך המקורי אחרת. עברו על הפריטים באמצעות each. הפריטים נשארים בסדר המקורי שלהם. השתמשו בחלוקה של מספרים שלמים כדי לחשב את ההנחה (price / 2).
  2. Was: $<n>: הסכום המקורי (השתמשו ב-values.sum)
  3. Now: $<n>: הסכום לאחר ההנחה
  4. שמות הפריטים שמחירם הסופי עדיין גבוה מ-2, מופרדים באמצעות , (השתמשו ב-select + keys במילון החדש)

עבור הקלט bread,milk עם המילון המוגדר כברירת מחדל, הפלט הוא:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

נסו בעצמכם

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: בנו hash של המחירים הסופיים באמצעות each; הדפיסו שורות, סכומים כוללים ופריטים יקרים
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר Ruby אונליין