Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

معامل Self

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 2 من 61.

عندما تحتاج إحدى الطرق إلى الوصول إلى البيانات المخزنة في instance من نوع struct، فإنها تستخدم المعامل &self. هذا المعامل الخاص يكون دائمًا الوسيط الأول في الطريقة، ويمثل مرجعًا إلى instance التي يتم استدعاء الطريقة عليها.

يعني الرمز & أننا نستعير instance بدلاً من امتلاكها. وهذا يسمح للطريقة بقراءة حقول struct دون استهلاك instance:

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    fn is_square(&self) -> bool {
        self.width == self.height
    }
}

داخل جسم الطريقة، تتيح لك self الوصول إلى جميع حقول البنية باستخدام تدوين النقطة. تقرأ طريقة area كلًّا من width وheight لحساب النتيجة وإرجاعها.

بما أن &self يستعير instance فقط، يمكنك استدعاء عدة methods على الـ struct نفسه دون أي مشاكل:

fn main() {
    let rect = Rectangle { width: 10, height: 5 };
    
    println!("Area: {}", rect.area());      // 50
    println!("Square? {}", rect.is_square()); // false
}

الطرق التي تستخدم &self للقراءة فقط. يمكنها فحص بيانات struct، لكنها لا تستطيع تغييرها. في الدرس التالي، ستتعلّم كيفية إنشاء طرق يمكنها تعديل instance.

challenge icon

التحدي

سهل

أنشئ بنية Circle تحتوي على حقل واحد: radius ‏(f64).

أضف كتلة تنفيذ لـ Circle تحتوي على طريقتين تستخدمان &self:

  • circumference: تُرجع المحيط على هيئة f64 (الصيغة: 2.0 * 3.14159 * radius)
  • diameter: تُرجع القطر على هيئة f64 (الصيغة: 2.0 * radius)

ستتلقى مُدخلاً واحدًا:

  • نصف قطر الدائرة (f64)

أنشئ نسخة Circle باستخدام نصف القطر المُعطى، ثم اطبع المحيط والقطر في سطرين منفصلين.

تنسيق الناتج المتوقع:

{circumference}
{diameter}

جرّب بنفسك

use std::io;

// TODO: عرّف الـ struct الخاص بـ Circle هنا


// TODO: أضف كتلة التنفيذ لـ Circle مع دوال circumference و diameter


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let radius: f64 = input.trim().parse().expect("Invalid number");
    
    // TODO: أنشئ نسخة من Circle واطبع الـ circumference والـ diameter
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت