الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 2 من 28/14 في الدورة~12 min
دروس الوحدة (2/2)

الأساليب والكتل ضمنا

في Rust، تشبه الطرق الوظائف، ولكن يتم تعريفها في سياق البنية (أو التعداد أو السمة)، وتكون المعلمة الأولى دائمًا self، والتي تمثل مثيل البنية التي يتم استدعاء الطريقة عليها.

تحديد الطرق مع ضمنا

لتعريف التوابع في البنية، نستخدم كتلة impl (التنفيذ) مع اسم البنية:

Rust
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 كمعلمة أولى لها تسمى الوظائف المرتبطة (أي ما يعادل الأساليب الثابتة في اللغات الأخرى).

غالبًا ما يتم استخدامها كمنشئين لإرجاع مثيلات جديدة للبنية. للاتصال بهم، استخدم بناء الجملة النقطتين المزدوجتين :::

Rust
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):

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

جربه بنفسك

تمرين#rust.m4.l2.e1
المحاولات: 0جارٍ التحميل…

أكمل كتلة impl عن طريق تحديد طريقة المنطقة التي تأخذ &self وترجع u32 (ضرب العرض والارتفاع).

جارٍ تحميل المحرر…
إظهار التلميح

اكتب `fn Area(&self) -> u32 { self.width \* self.height }`داخل كتلة`impl Rectangle`.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m4.l2.e2
المحاولات: 0جارٍ التحميل…

حدد الدالة المرتبطة بالمربع داخل مستطيل ضمني، والتي تتلقى الحجم: u32 وترجع مثيل مستطيل بعرض وارتفاع يساوي الحجم.

جارٍ تحميل المحرر…
إظهار التلميح

اكتب fn Square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`داخل كتلة`impl`.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m4.l2.e3
المحاولات: 0جارٍ التحميل…

أضف طريقة المقياس mutator إلى المستطيل داخل كتلة impl. يجب أن تأخذ طريقة القياس مرجعًا قابلاً للتغيير إلى self (&mut self) وعاملًا: المعلمة u32، وضرب كل من عرض المستطيل وارتفاعه بالعامل.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتنفيذ مقياس fn(&mut self, Factor: u32) لتحديث self.width وself.height عن طريق ضربهما في Factor.

الحل متاح بعد 3 من المحاولات