Menu
Coddy logo textTech

מיזוג ושינוי

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

יש שתי פעולות שחוזרות לעיתים קרובות כל כך בעבודה עם גיבובים, עד ש-Ruby נותנת להן שיטות משלהן.

merge משלבת שני גיבובים לגיבוב חדש. כשיש לשניהם אותו מפתח, הערך שבצד ימין גובר:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect   # {color: "red", size: "L"}

אף אחד מהמקוריים לא משתנה, merge מחזירה hash חדש.

transform_values בונה hash חדש עם אותם מפתחות, אבל כל ערך מועבר דרך בלוק:

prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect   # {apple: 1.2, bread: 3.6}

ו־transform_keys עושה את אותו הדבר עבור מפתחות, שימושי כשממירים מחרוזות לסמלים או מנרמלים את האותיות:

{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}
challenge icon

אתגר

בינוני

נתונות שתי מפות עגלת קניות: monday ו-tuesday, שכל אחת ממפה שם פריט כמחרוזת לכמות כמספר שלם. החנות רוצה סך הכול מנורמל ליומיים.

צרו מפה סופית אחת באמצעות:

  1. מיזוג שתי המפות באמצעות merge עם בלוק, כך שכמויות המפתחות שמופיעים בשתיהן יחוברו (ולא יידרסו)
  2. הפעלת transform_keys(&:to_sym) על התוצאה, כך שהמפתחות יהפכו לסמלים
  3. הפעלת transform_values כדי להחיל הנחת כמות של 10%: כל כמות תהפוך ל-(qty * 9 / 10) באמצעות חשבון של מספרים שלמים

הדפיסו את המפה הסופית באמצעות inspect.

עבור נתוני ברירת המחדל, הפלט הוא:

{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}

(תפוחים: 5 + 5 = 10, ואז 9. לחם: 3 + 2 = 5, ואז 4. חלב: 6 ביום שני בלבד → 5. גבינה: 2 ביום שלישי בלבד → 1.)

נסו בעצמכם

monday  = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }

# TODO: השתמשו ב-merge עם בלוק כדי לסכום ערכים של מפתחות חופפים, ואז המירו את המפתחות לסמלים,
#       ואז החילו * 9 / 10 על כל ערך, ואז בדקו את התוצאה
quiz iconבחנו את עצמכם

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

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

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