غالبًا ما يكون من المفيد جمع مجموعة من العناصر معًا، والتعامل مع هذه المجموعات كوحدات متكاملة. وفي Cairo، نسمي هذه المجموعة بنية (struct)، ونسمي كل عنصر فيها حقلًا من حقول البنية. وتحدد البنية المجموعة العامة من الحقول المتاحة، أما المثال المحدد من البنية فيُسمى نسخة.
علاوة على ذلك، يمكن تعريف طرق على البنيات، وهذه الطرق لها حق الوصول إلى الحقول.
وتُشار إلى البنية نفسها في هذه الحالة باسم self.
وعندما تستخدم طريقة ما ref self: SomeStruct، يمكن تغيير الحقول أو تعديلها.
وعندما تستخدم طريقة ما self: SomeStruct أو self: @SomeStruct، لا يمكن تغيير الحقول: فهي غير قابلة للتغيير.
ويساعد التحكم في القابلية للتغيير مدقّق الاستعارة على ضمان ألّا تحدث في Cairo أصناف كاملة من أخطاء التزامن.
في هذا التمرين، ستُنفّذ نوعين من الطرق على بنية. النوع الأول يُعرف عمومًا باسم الدوال الجالبة (getters): فهي تكشف حقول البنية للعالم الخارجي، دون أن تسمح لأي جهة أخرى بتغيير تلك القيمة.
وستنفّذ أيضًا طرقًا من نوع آخر، تُعرف عمومًا باسم الدوال المُعدِّلة (setters). فهي تغيّر قيمة الحقل. ولا تنتشر الدوال المُعدِّلة كثيرًا في Cairo، فإذا كان الحقل قابلًا للتعديل بحرية، فالأكثر شيوعًا هو جعله عامًّا، لكنها مفيدة إذا كان تحديث الحقل ينبغي أن يُحدث آثارًا جانبية.
تُعرّف البنيات باستخدام الكلمة المفتاحية struct، متبوعة بالاسم المكتوب بحرف كبير في البداية للنوع الذي تصفه البنية:
struct Item {}
ثم تُضاف أنواع إضافية إلى جسم البنية بوصفها حقولًا للبنية، ولكل منها نوعه الخاص:
struct Item {
name: String,
weight: f32,
worth: u32,
}
تُعرّف السمة (trait) مجموعة من الطرق التي يمكن لنوع أن ينفّذها (سنركز هنا على البنيات، لكن يمكن أيضًا تنفيذ السمات على التعدادات).
ويمكن استدعاء هذه الطرق على نسخ من النوع عند تنفيذ هذه السمة.
وتُعرّف السمات باستخدام الكلمة المفتاحية trait، وداخل السمات نحدد تواقيع الطرق التي نريد لنوعنا أن ينفّذها.
trait ImplTrait {
// Define the method signature
fn new() -> Item;
}
وأخيرًا، يمكن تعريف الطرق على البنيات داخل كتلة impl، التي تنفّذ السمة المعرَّفة:
impl ItemImpl of ImplTrait {
// initializes and returns a new instance of our Item struct
fn new() -> Item {
Item {}
}
}
أنت تعمل على بناء نظام لمراقبة الصحة. وكجزء من ذلك، تحتاج إلى تتبّع الإحصاءات الصحية للمستخدمين.
ستبدأ ببعض الدوال المبدئية داخل كتلة impl، إضافة إلى تعريف الـ struct التالي:
pub struct User {
name: String,
age: u32,
weight: u32,
}
هدفك هو تنفيذ الطرق المبدئية المعرّفة على الـ struct المسمّى User داخل كتلة impl.
على سبيل المثال، يجب أن تُرجع الطريقة new نسخة من الـ struct المسمّى User بالاسم والعمر والوزن المحدَّدين.
let mut bob = User::new("Bob", 32, 72);
// Returns: a User with name "Bob", age 32, and weight 72
يجب أن تُرجع الطريقة weight وزن الـ User.
bob.weight();
// Returns: 72
يجب أن تضبط الطريقة set_age عمر الـ User.
bob.set_age(33);
// Updates Bob's age to 33; happy birthday Bob!
أتمنى لك وقتًا ممتعًا!
سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.