Menu
Coddy logo textTech

הבנת סגירות

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 46 מתוך 65.

סגירה היא סוג מיוחד של פונקציה ש״זוכרת״ משתנים מהמקום שבו היא נוצרה, גם לאחר שההקשר המקורי הזה סיים לפעול. חשבו עליה כפונקציה שנושאת איתה חלק ממקום הולדתה לכל מקום שאליו היא הולכת.

כשיוצרים פונקציה בתוך פונקציה אחרת, לפונקציה הפנימית יש גישה למשתנים של הפונקציה החיצונית. מה שהופך זאת לסגירה (closure) הוא שהגישה הזו נשמרת גם לאחר שהפונקציה החיצונית סיימה את ביצועה.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

בדוגמה הזו, הפונקציה האנונימית שמוחזרת על ידי createGreeting היא סגירה. היא לוכדת את הפרמטר name מהתחום שסביבה. גם לאחר שההרצה של createGreeting מסתיימת, הפונקציה המוחזרת עדיין זוכרת מה היה הערך של name.

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

challenge icon

אתגר

קל

צרו תוכנית שמדגימה סגירות באמצעות בניית מערכת ליצירת הודעות מותאמות אישית. התוכנית שלכם תיצור פונקציות ש״זוכרות״ מידע מסוים ומשתמשות בו כדי ליצור הודעות מותאמות אישית, גם לאחר שההקשר המקורי הסתיים.

  1. קראו קלט מסוג מחרוזת המייצג שם של אדם
  2. קראו קלט מסוג מחרוזת המייצג סוג ברכה ("formal", "casual", או "friendly")
  3. קראו קלט מסוג מחרוזת המייצג שם של חברה
  4. צרו פונקציה בשם createMessageGenerator שמקבלת שם וסוג ברכה כפרמטרים
  5. הפונקציה 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]!"
  6. קראו לפונקציה createMessageGenerator עם קלטי השם וסוג הברכה כדי לקבל את פונקציית הסגירה
  7. קראו לפונקציית הסגירה שהוחזרה עם קלט שם החברה כדי ליצור את ההודעה
  8. הציגו את התוצאות בדיוק בפורמט שמוצג למטה

לדוגמה, אם הקלטים הם "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");
}
quiz iconבחנו את עצמכם

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

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

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