הבנת סגירות
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 46 מתוך 65.
סגירה היא סוג מיוחד של פונקציה ש״זוכרת״ משתנים מהמקום שבו היא נוצרה, גם לאחר שההקשר המקורי הזה סיים לפעול. חשבו עליה כפונקציה שנושאת איתה חלק ממקום הולדתה לכל מקום שאליו היא הולכת.
כשיוצרים פונקציה בתוך פונקציה אחרת, לפונקציה הפנימית יש גישה למשתנים של הפונקציה החיצונית. מה שהופך זאת לסגירה (closure) הוא שהגישה הזו נשמרת גם לאחר שהפונקציה החיצונית סיימה את ביצועה.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}בדוגמה הזו, הפונקציה האנונימית שמוחזרת על ידי createGreeting היא סגירה. היא לוכדת את הפרמטר name מהתחום שסביבה. גם לאחר שההרצה של createGreeting מסתיימת, הפונקציה המוחזרת עדיין זוכרת מה היה הערך של name.
סגירות שימושיות להפליא ליצירת פונקציות ייעודיות או לשמירה על מצב בצורה נקייה. הן מאפשרות לך לבנות פונקציות המותאמות אישית לסביבה שבה הן נוצרו, וכך להפוך את הקוד שלך לגמיש ועוצמתי יותר.
אתגר
קלצרו תוכנית שמדגימה סגירות באמצעות בניית מערכת ליצירת הודעות מותאמות אישית. התוכנית שלכם תיצור פונקציות ש״זוכרות״ מידע מסוים ומשתמשות בו כדי ליצור הודעות מותאמות אישית, גם לאחר שההקשר המקורי הסתיים.
- קראו קלט מסוג מחרוזת המייצג שם של אדם
- קראו קלט מסוג מחרוזת המייצג סוג ברכה (
"formal","casual", או"friendly") - קראו קלט מסוג מחרוזת המייצג שם של חברה
- צרו פונקציה בשם
createMessageGeneratorשמקבלת שם וסוג ברכה כפרמטרים - הפונקציה
createMessageGeneratorצריכה להחזיר פונקציה אחרת (סגירה) אשר: - מקבלת שם חברה כפרמטר
- משתמשת בשם ובסוג הברכה מהתחום של הפונקציה החיצונית
- מחזירה הודעה מעוצבת בהתאם לסוג הברכה:
- עבור
"formal":"Dear [name], we are pleased to welcome you to [company]." - עבור
"casual":"Hey [name]! Welcome to [company]!" - עבור
"friendly":"Hi [name], so glad you joined [company]!" - קראו לפונקציה
createMessageGeneratorעם קלטי השם וסוג הברכה כדי לקבל את פונקציית הסגירה - קראו לפונקציית הסגירה שהוחזרה עם קלט שם החברה כדי ליצור את ההודעה
- הציגו את התוצאות בדיוק בפורמט שמוצג למטה
לדוגמה, אם הקלטים הם "Alice", "formal", ו-"TechCorp", התוכנית שלכם צריכה להציג:
Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfullyאם הקלטים הם "Bob", "casual", ו-"StartupXYZ", התוכנית שלכם צריכה להציג:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullyאם הקלטים הם "Carol", "friendly", ו-"InnovateLab", התוכנית שלכם צריכה להציג:
Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfullyהתוכנית שלכם חייבת להדגים סגירות באמצעות יצירת פונקציה שמחזירה פונקציה אחרת. לפונקציה המוחזרת (סגירה) צריכה להיות גישה למשתנים מהתחום של הפונקציה החיצונית (שם וסוג ברכה), גם לאחר שהפונקציה החיצונית סיימה לפעול. השתמשו במשפטי תנאי כדי לקבוע את פורמט ההודעה המתאים בהתאם לקלט של סוג הברכה.
נסו בעצמכם
import 'dart:io';
void main() {
// קרא את הקלט
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// הצג את כותרת המערכת
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: כתוב את הקוד שלך למטה
// צור את הפונקציה createMessageGenerator שמחזירה פונקציה פנימית
// קרא לפונקציה וצור את ההודעה
// הצג את התוצאות הסופיות
print("Generated message: \$message");
print("Message generation completed successfully");
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין