פקודת Match
מבוא
פקודת match היא פקודת בקרה שמשווה ערך אחד למספר תבניות לשם פיצול.
שימושי כשמעוניינים לבטא את כוונת הפיצול באופן ברור יותר מאשר שרשרת if / else if.
פקודת ה-match של Wave כיום היא פקודה כך שהתוצאה אינה נתמכת כנוסחה.
כלומר, var x = match (...) { ... } מתכונת כזו אינה נתמכת.
תחביר בסיסי
match (value) {
pattern1 => {
// בלוק ביצוע
}
pattern2 => {
// בלוק ביצוע
}
_ => {
// בלוק ברירת מחדל
}
}
כללי התחביר:
- הכותרת משתמשת במתכונת
match (expr). - כל arm משתמש במתכונת
{ ... }. - גוף ה-arm צריך להיות
{ ... }בלוק. - ניתן להשתמש בהפרדת שורה בין זרועות, או להשתמש ב-
,או;.
סוגי תבניות
התבניות הנתמכות כעת הן 3 סוגים:
- תבנית ליטרלית של מספר שלם
0 => { ... }
1 => { ... }
42 => { ... }
- תבניות זיהוי
Off => { ... }
On => { ... }
תבנית זהות משמשת עבור ערכים הניתנים לפירוש כקבועים שלמים, כגון משתנה ספירה.
- תבנית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, זרוע תואמת אחת בלבד תופעל. - אין נפילות אוטומטיות.
- ניתן להשתמש בבלוק
_רק פעם אחת. - מותר לפי התחביר גם אם אין בלוק
_. (אם אין זרוע תואמת, אף זרוע אינה מופעלת)
ענייני זהירות
- אסור להצהיר על מקרים כפולים
- הצהרה כפולה על אותו מקרה תגרום לשגיאת קומפילציה.
- אין לחזור על
_
- לא ניתן להצהיר פעמיים נוספות על זרוע בלוק
_.
- הכרחי להשתמש בבלוקים של זרוע
- לאחר
=>יש להשתמש בבלוק{ ... }.
- תבניות חייבות להיות קבועים
- השתמשו בתבניות זיהוי רק עבור ערכים הניתנים לפירוש כקבועים שלמים/משתנה ספירה.
סיכום
ה-match של Wave הוא פקודת בקרה אופטימלית לפיצול של מספרים שלמים/enum.
משתמשים במבנה => + בלוק, ויכולים ליצור פיצול ברירת מחדל באמצעות wildcard (_).
ככל שהתיקים מתרבים, match נוח יותר לקריאה ומאפשר להציג את הכוונה בבירור לעומת if / else if.
