Menu
Coddy logo textTech

תבניות והתאמה (3.0)

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 87 מתוך 110.

Dart 3 הציגה התאמת תבניות, דרך עוצמתית לפרק נתונים ולבדוק אותם בביטוי יחיד. תבניות מאפשרות לך לחלץ ערכים מאובייקטים, לבדוק את המבנה שלהם ולקשור משתנים — הכול בבת אחת.

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

void main() {
  // תבניות רשימה
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // תבניות מפה
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice בת 30
}

דפוסים נעשים עוצמתיים במיוחד בביטויי switch. אפשר להתאים בו-זמנית לפי טיפוס, ערך ומבנה:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // מספר שלילי
  print(describe(42));        // מספר חיובי: 42
  print(describe([1, 2, 3])); // רשימה שמתחילה ב-1
}

סעיף when מוסיף תנאים לתבניות, ו-... מתאים לרכיבים הנותרים ברשימה. הקו התחתון _ משמש כתו כללי שמתאים לכל דבר. בשילוב עם מחלקות אטומות, תבניות מאפשרות טיפול ממצה ובטוח מבחינת טיפוסים במבני נתונים מורכבים.

challenge icon

אתגר

קל

בואו נבנה מסווג נתונים שמשתמש בהתאמת תבניות כדי לנתח ולסווג סוגים שונים של קלט! תיצרו מערכת שיכולה לזהות ולתאר מבני נתונים שונים באמצעות תכונות התאמת התבניות העוצמתיות של Dart 3.

תארגנו את הקוד שלכם בשני קבצים:

  • classifier.dart: צרו פונקציה בשם classify שמקבלת פרמטר מסוג Object ומחזירה תיאור מסוג String. השתמשו בביטוי switch עם התאמת תבניות כדי לטפל במקרים הבאים:
    • רשימה ריקה [] צריכה להחזיר Empty list
    • רשימה עם איבר שלם אחד בדיוק צריכה להחזיר Single item: [value]
    • רשימה עם שני איברים בדיוק צריכה להחזיר Pair: [first] and [second]
    • רשימה שמתחילה במספר שלם ואחריו איברים נוספים צריכה להחזיר List starting with [first], length: [total length] (השתמשו בתבנית השארית ...)
    • מפה שמכילה גם את המפתחות 'name' וגם 'age' צריכה להחזיר [name] is [age] years old (השתמשו בפירוק מבני של תבנית מפה)
    • מספר שלם שלילי (השתמשו בסעיף when) צריך להחזיר Negative: [value]
    • מספר שלם ששווה לאפס צריך להחזיר Zero
    • כל מספר שלם אחר צריך להחזיר Positive: [value]
    • כל ערך אחר צריך להחזיר Unknown type
  • main.dart: ייבאו את המסווג שלכם והדגימו התאמת תבניות באמצעות מגוון קלטים. הדפיסו את התוצאה של סיווג כל אחד מהערכים הבאים:
    • רשימה ריקה []
    • רשימה עם איבר אחד: [42]
    • רשימה עם שני איברים: ['hello', 'world']
    • רשימה ארוכה יותר: [1, 2, 3, 4, 5]
    • מפה: {'name': 'Alice', 'age': 25}
    • המספר השלם -10
    • המספר השלם 0
    • המספר השלם 99

האתגר הזה משלב תבניות רשימה, תבניות מפה, את סעיף when לבדיקת תנאים ואת תבנית השארית (...) — כל תכונות התאמת התבניות המרכזיות מהשיעור!

הפלט הצפוי:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

נסו בעצמכם

import 'classifier.dart';

void main() {
  // TODO: השתמשו בפונקציה classify כדי לסווג כל ערך
  // והדפיסו את התוצאות
  
  // בדקו עם רשימה ריקה
  print(classify([]));
  
  // TODO: בדקו עם רשימה המכילה איבר אחד: [42]
  
  // TODO: בדקו עם רשימה המכילה שני איברים: ['hello', 'world']
  
  // TODO: בדקו עם רשימה ארוכה יותר: [1, 2, 3, 4, 5]
  
  // TODO: בדקו עם מפה: {'name': 'Alice', 'age': 25}
  
  // TODO: בדקו עם המספר השלם -10
  
  // TODO: בדקו עם המספר השלם 0
  
  // TODO: בדקו עם המספר השלם 99
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

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