מיזוג ושינוי
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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}אתגר
בינונינתונות שתי מפות עגלת קניות: monday ו-tuesday, שכל אחת ממפה שם פריט כמחרוזת לכמות כמספר שלם. החנות רוצה סך הכול מנורמל ליומיים.
צרו מפה סופית אחת באמצעות:
- מיזוג שתי המפות באמצעות
mergeעם בלוק, כך שכמויות המפתחות שמופיעים בשתיהן יחוברו (ולא יידרסו) - הפעלת
transform_keys(&:to_sym)על התוצאה, כך שהמפתחות יהפכו לסמלים - הפעלת
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 על כל ערך, ואז בדקו את התוצאה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין