انتقل إلى المحتوى الرئيسي

هيكل

نظرة عامة

الهيكل في لغة Wave هو مكون أساسي لإعلان أنواع البيانات المعرفة من قِبل المستخدم. عندما يتم استخدام الهيكل، يمكن الجمع بين قيم من أنواع مختلفة في وحدة منطقية واحدة، ويمكن من خلاله بناء هياكل بيانات معقدة بشكل واضح وآمن.

يعمل هيكل Wave كنوع قيمي (value type). يجب أن تكون كل الحقول موضحة بشكل ثابت ومحددة عند إنشاء نموذج هيكل. بواسطة هذه القواعد، يحتفظ الهيكل بوضعية كاملة وقابلة للتنبؤ.

نحو إعلان الهيكل

يُعلن عن الهيكل باستخدام الكلمة المحجوزة struct. يتم سحب اسم الهيكل باستخدام PascalCase، ويمكن تعريف حقل واحد أو أكثر في نص الهيكل.

الحقول معرفة باستخدام الصيغة 'name: type;' وكل إعلان حقل يجب أن ينتهي بعلامة الفاصل المنقوط.

struct Box {
size: i32;
weight: f32;
}

عند اعلان الهيكل، يتم ترتيب الحقول بنفس ترتيب الذاكرة. يُسمح فقط بإعلان الحقول داخل الهيكل، ولا يمكن تضمين وظائف أو أساليب. يی تم تعريف اللوج العملي خارج الهيكل.

نحو إنشاء الهيكل

يتم إنشاء الهيكل بصيغة ليترال اسم الهيكل. يمكن إنشاء هيكل باستخدام التعبير النصي StructName { اسم الحقل: القيمة; ... يتم كتابته بصيغة }'. كتلة.

var b: Box = Box {
size: 42;
weight: 10.5;
};

عند إنشاء هيكل، يجب تهيئة جميع الحقول المعرفة، وفي حالة فقد أي حقل تحدث خطأ في الكمايل.

عند التهيئة، ليس من اللازم أن تتوافق أوامر كتابة الحقول مع أوامر إعلان الهيكل، ولكن يجب أن تتطابق أنواع القيم الممررة إلى الحقول مع أنواع الهيكل. في Wave، التحويل الضمني لأنواع البيانات ليس مسموحا أثناء عملية تهيئة حقول الهيكل.


نحو الوصول إلى حقول الهيكل

يتم الوصول إلى الحقول في الهيكل باستخدام الترميز النقطي (dot notation). تمت كتابة أو قراءة الحقول بنفس النحو.

println("Size: {}", b.size);
println("Weight: {}", b.weight);

إذا تم استخدام اسم حقل تيس الوجود، يتم حدوث خطأ في الكمايل. لأن الهيكل هو نوع القيمة، عند تسليم الهيكل كله أو إرساله كمدخل إلي الدالة، تتم نسخ كل الحقول المضمنة معا.


نحو تعريف أساليب الهيكل

في لغة Wave، لا تم تعريف الأساليب مباشرة داخل الهيكل. باستخدام الكنية proto، يتم تعريف مجموعة الأساليب المرتبطة بالهيكل.

كنية proto هي منطق الدوال التابعة لهيكل محدد، والدوال المعرفة داخل هذه الكنية تعمل كنوع من أسبوب لهذا الهيكل.

تستخدم الأساليب تمرير المتغير الأول self، الذي يمثل مثيل الهيكل. proto تعني القيمة بالكامل للهيكل وتمرر بطريقة نسخ القيم.

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);

استخدام الهيكل كحجة دالة

عند استخدام الهيكل كمدخل للدالة، يتم معاملته بطريقة نسخ القيم. حتى لو غيرت جوا الدالة، فإن الأثر يبقى في المثيل المعين.

fun calc(box: Box) -> i32 {
return box.size * 2;
}

تحدث نسخة القيمة في حالة استعمال الهيكل كنتيجة للدالة. يكفل هذه السلوكية ثبات هيكل مع مسار بيانات قابل للتنبؤ.


الهيكل المتعشّق (Nested Struct)

في Wave، يمكن استخدام هيكل ذو نوع حقل هيكل آخر. باعتبار أن الهيكل نوع كامل، يمكن التعشيق بحرية بهيئة تضم هيكل آخر.

struct Position {
x: i32;
y: i32;
}

struct Player {
name: str;
pos: Position;
}

يمكن للعضو في الهيكل المتعشّق أن تتواصل الوصول عبر الترميز البنقطي.

var p: Player = Player {
name: "Alice";
pos: Position { x: 10; y: 20; };
};

println("Player X: {}", p.pos.x);
println("Player Y: {}", p.pos.y);

يمكن كتابة هيكل في الهيكل النصي ويمكن للقواعد التهيئة أن تتطبق تلقائيا.


مصفوفة الهيكل

يمكن استخدام الهيكل كنوع للعناصر في مجموعة واحدة. تستخدام قواعد مجموعات Wave الشكل array<type, length> ويمكن تعريف الهيكل كنوع للمجموعة.

var players: array<Player, 3> = [
Player { name: "A"; pos: Position { x: 1; y: 2; }; },
Player { name: "B"; pos: Position { x: 3; y: 4; }; },
Player { name: "C"; pos: Position { x: 5; y: 6; }; }
];

عند الوصول إلى مجموعة مئوية ملكوقية، استخدم الترميز البنقطي وفي وصول إلى داخل المعلومات.

println("Second Player X: {}", players[1].pos.x);

مدى إمكانية العمليات الأساسية على الهيكل

نظرا المتساريت رقح صنف السامكو واثناف الهيكل تمافقة شونه.

إذا كان الحاجة ملاءمة المقارنة، الترتيب، التهاكي، وجود صغائر للرشة المقصله، بإمكانك تعريف السلوك ذات الصلة باستخدام كنية proto. تنص لغة Wave على عدم تقديم مُعَرّفات ضمنيوة للجميع، وتعمل خطة على أن جميع السلوكيات يتم تعريفها صرامة.