Procs ו־Lambdas
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 19 מתוך 56.
בלוק אינו אובייקט, אי אפשר לאחסן אותו במשתנה. כשרוצים קטע קוד שאפשר להעביר הלאה, לשמור ולהפעיל מאוחר יותר, עוטפים אותו ב־Proc או ב־lambda.
Proc נוצר באמצעות Proc.new או מילת המפתח proc. קוראים לו באמצעות .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14למבדה דומה, אבל מחמירה יותר: היא בודקת שהעברת את מספר הארגומנטים הנכון. הצורה עם חץ -> היא הכתיב הנפוץ:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (קיצור של .call)אפשר להעביר את שניהם למתודה שמצפה לבלוק על ידי הוספת & כתחילית:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]השתמשו ב-lambda כשרוצים בדיקת ארגומנטים קפדנית יותר; השתמשו ב-Proc כשרוצים התנהגות מקלה וגמישה יותר.
אתגר
קלצרו למבדה בשם tripler שמקבלת מספר אחד ומחזירה אותו כפול 3.
לאחר מכן קראו רשימת מספרים שלמים המופרדת בפסיקים והדפיסו, בשורות נפרדות:
- את התוצאה של קריאה ל־
tripler.call(10) - את מספרי הקלט כשהם מוכפלים פי 3 (השתמשו ב־
map(&tripler)) ומחוברים באמצעות,
עבור הקלט 1,2,3, הפלט הוא:
30
3, 6, 9נסו בעצמכם
# TODO: הגדירו את `tripler` כביטוי lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: בשורה 1, הדפיסו את tripler.call(10)
# TODO: בשורה 2, הפעילו map על numbers באמצעות &tripler, ואז חברו את התוצאות באמצעות ", "
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין