מבנים
סקירה כללית
מבני השפה Wave הם אלמנט תחבירי מרכזי להצהרה על טיפוסי נתונים מותאמים אישית. מבנה מאפשר חיבור ערכים מסוגים שונים ליחידה לוגית אחת, ובכך מאפשר דגם מורכב של מבנים בצורה ברורה ובטוחה.
מבני Wave פועלים כטיפוסי ערכים. כל שדה חייב להכיל טיפוס מוגדר, ובזמן יצירת מופע כל השדות חייבים להיות מאותחלים. חוקים אלו מבטיחים שמצב המבנה תמיד יהיה מושלם וניתן לחיזוי.
תחביר הצהרת מבנים
מבנה מוכרז בעזרת מילת המפתח struct.
שמות מבנים כתובים בתבנית פסקל (PascalCase) ומבנה יכול להכיל שדה אחד או יותר.
השדות מוכרזים בפורמט שם: סוג;, ויש צורך בנקודה פסיק אחרי כל הכרזה של שדה.
struct Box {
size: i32;
weight: f32;
}
סדר השדות שנכתבים בהצהרת מבנה זהה לסדר האחסון בזיכרון. בתוך מבנה ניתן לכלול רק הצהרות על שדות, ולא ניתן לכלול פונקציות או שיטות. לוגיקת הפעולה מוגדרת מחוץ למבנה בצורה נפרדת.
תחביר יצירת מבנים
מבנה נוצר באופן ליטרלי על ידי שימוש בשם המבנה.
ליטרל של מבנה נכתב בצורה StructName { שם שדה: ערך; ... נכתב בצורה }.
var b: Box = Box {
size: 42;
weight: 10.5;
};
בעת יצירת מבנה כל השדות שהוגדרו חייבים להיות מאותחלים ובמקרה של השמטה, תתרחש שגיאת קומפילציה.
בעת האתחול, סדר כתיבת השדות אינו חייב להתאים לסדר הכרזת המבנה, אך סוג הערך המועבר לכל שדה חייב להתאים במדויק לסוג שהוגדר במבנה. ב-Wave לא מתאפשרת המרה עלומה של סוגים בתהליך אתחול שדות מבנה.
תחביר גישה לשדות במבנה
גישה לשדות במבנה מתבצעת בעזרת תחביר נקודה. גישה לשדה היא חלקה, גם בקריאה וגם בכתיבה.
println("גודל: {}", b.size);
println("משקל: {}", b.weight);
שימוש בשם של שדה שאינו קיים גורם לשגיאת קומפילציה. העברת מבנה בתור ערך משמעותה שכל השדות מועתקים בעת ההעברה.
תחביר הגדרת פעולות למבנים
Wave אינה מאפשרת להגדיר פונקציות ישירות בתוך מבנה.
במקום זאת, משתמשים במילת proto כדי להצהיר פעולות הקשורות למבנה.
בלוק proto הוא מרחב של פונקציות הקשורות למבנה מסוים, והפונקציות המוגדרות בתוך בלוק זה משמשות כשיטות לאותו מבנה.
שיטה מקבלת את מופע המבנה כפרמטר ראשון באמצעות self.
self מייצג את ערך המבנה כולו, ומועבר בשיטת העתקת ערך.
proto Box {
fun print(self) {
println("size={}, weight={}", self.size, self.weight);
}
fun added_size(self, x: i32) -> i32 {
return self.size + x;
}
}
בלוק proto אינו חייב להיות באותו קובץ עם הכרזת המבנה, וניתן להגדיר מנגנוני proto מרובים לאותו מבנה.
קריאת שיטה נעשית באמצעות תחביר נקודה ומתבצע באותו אופן כמו קריאת פונקציה רגילה.
b.print();
var n: i32 = b.added_size(5);