دروس الوحدة (2/2)
الأساليب والكتل ضمنا
في Rust، تشبه الطرق الوظائف، ولكن يتم تعريفها في سياق البنية (أو التعداد أو السمة)، وتكون المعلمة الأولى دائمًا self، والتي تمثل مثيل البنية التي يتم استدعاء الطريقة عليها.
تحديد الطرق مع ضمنا
لتعريف التوابع في البنية، نستخدم كتلة impl (التنفيذ) مع اسم البنية:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
// This is an instance method. It takes &self for reading.
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect = Rectangle { width: 30, height: 50 };
// Call the method using dot notation
println!("The area is: {}", rect.area());
}الوظائف المرتبطة (الثابتة).
الوظائف المعرفة ضمن كتلة impl والتي لا تقبل self كمعلمة أولى لها تسمى الوظائف المرتبطة (أي ما يعادل الأساليب الثابتة في اللغات الأخرى).
غالبًا ما يتم استخدامها كمنشئين لإرجاع مثيلات جديدة للبنية. للاتصال بهم، استخدم بناء الجملة النقطتين المزدوجتين :::
impl Rectangle {
// Associated function
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}
fn main() {
// Call the associated function
let sq = Rectangle::square(10);
}طرق تعديل الحالة: &mut self
إذا احتاجت إحدى الطرق إلى تعديل حقول البنية، فيجب أن تعلن عن المعلمة الأولى الخاصة بها على أنها &mut self. يجب الإعلان عن المثيل نفسه الذي يتم استدعاء الطريقة عليه على أنه قابل للتغيير (let mut):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}جربه بنفسك
أكمل كتلة impl عن طريق تحديد طريقة المنطقة التي تأخذ &self وترجع u32 (ضرب العرض والارتفاع).
إظهار التلميح
اكتب `fn Area(&self) -> u32 { self.width \* self.height }`داخل كتلة`impl Rectangle`.
الحل متاح بعد 3 من المحاولات
حدد الدالة المرتبطة بالمربع داخل مستطيل ضمني، والتي تتلقى الحجم: u32 وترجع مثيل مستطيل بعرض وارتفاع يساوي الحجم.
إظهار التلميح
اكتب fn Square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`داخل كتلة`impl`.
الحل متاح بعد 3 من المحاولات
أضف طريقة المقياس mutator إلى المستطيل داخل كتلة impl. يجب أن تأخذ طريقة القياس مرجعًا قابلاً للتغيير إلى self (&mut self) وعاملًا: المعلمة u32، وضرب كل من عرض المستطيل وارتفاعه بالعامل.
إظهار التلميح
قم بتنفيذ مقياس fn(&mut self, Factor: u32) لتحديث self.width وself.height عن طريق ضربهما في Factor.
الحل متاح بعد 3 من المحاولات