דלג לתוכן הראשי

פקודת Match

מבוא

פקודת match היא פקודת בקרה שמשווה ערך אחד למספר תבניות לשם פיצול. שימושי כשמעוניינים לבטא את כוונת הפיצול באופן ברור יותר מאשר שרשרת if / else if.

פקודת ה-match של Wave כיום היא פקודה כך שהתוצאה אינה נתמכת כנוסחה. כלומר, var x = match (...) { ... } מתכונת כזו אינה נתמכת.


תחביר בסיסי

match (value) {
pattern1 => {
// בלוק ביצוע
}
pattern2 => {
// בלוק ביצוע
}
_ => {
// בלוק ברירת מחדל
}
}

כללי התחביר:

  • הכותרת משתמשת במתכונת match (expr).
  • כל arm משתמש במתכונת { ... }.
  • גוף ה-arm צריך להיות { ... } בלוק.
  • ניתן להשתמש בהפרדת שורה בין זרועות, או להשתמש ב-, או ;.

סוגי תבניות

התבניות הנתמכות כעת הן 3 סוגים:

  1. תבנית ליטרלית של מספר שלם
0 => { ... }
1 => { ... }
42 => { ... }
  1. תבניות זיהוי
Off => { ... }
On => { ... }

תבנית זהות משמשת עבור ערכים הניתנים לפירוש כקבועים שלמים, כגון משתנה ספירה.

  1. תבניתWildcard (_)
_ => { ... }

arm ברירת מחדל מופעלת כאשר אין התאמה עם תבנית אחרת.


סוגי מטרות להתאמה

לפי היישום הנוכחי, מטרת ההתאמה של match צריכה להיות סדרות של מספרים שלמים/enum. מחרוזות, נקודות צפות, מבנים וכו' אינם נתמכים במטרות match.


דוגמה 1: פיצול של מספר שלם

fun classify_num(v: i32) -> i32 {
var result: i32 = -1;

match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}

return result;
}

דוגמה 2: פיצול enum

enum Mode -> i32 {
Off = 0,
On = 1,
Unknown = 2
}

fun classify_mode(m: Mode) -> i32 {
match (m) {
Off => {
return 1;
}
On => {
return 2;
}
_ => {
return 3;
}
}
}

חוקי הפעלה

  • בדומה לשלבים switch, זרוע תואמת אחת בלבד תופעל.
  • אין נפילות אוטומטיות.
  • ניתן להשתמש בבלוק _ רק פעם אחת.
  • מותר לפי התחביר גם אם אין בלוק _. (אם אין זרוע תואמת, אף זרוע אינה מופעלת)

ענייני זהירות

  1. אסור להצהיר על מקרים כפולים
  • הצהרה כפולה על אותו מקרה תגרום לשגיאת קומפילציה.
  1. אין לחזור על _
  • לא ניתן להצהיר פעמיים נוספות על זרוע בלוק _.
  1. הכרחי להשתמש בבלוקים של זרוע
  • לאחר => יש להשתמש בבלוק { ... }.
  1. תבניות חייבות להיות קבועים
  • השתמשו בתבניות זיהוי רק עבור ערכים הניתנים לפירוש כקבועים שלמים/משתנה ספירה.

סיכום

ה-match של Wave הוא פקודת בקרה אופטימלית לפיצול של מספרים שלמים/enum. משתמשים במבנה => + בלוק, ויכולים ליצור פיצול ברירת מחדל באמצעות wildcard (_).

ככל שהתיקים מתרבים, match נוח יותר לקריאה ומאפשר להציג את הכוונה בבירור לעומת if / else if.