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

معامل Self

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 2 من 61.

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

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

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 إمكانية الوصول إلى جميع حقول الـ struct باستخدام تدوين النقطة (dot notation). تقرأ الميثود area كلاً من width و height لحساب النتيجة وإرجاعها.

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

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

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

challenge icon

التحدي

سهل

أنشئ Circle struct بحقل واحد: radius (f64).

أضف كتلة تنفيذ (implementation block) لـ Circle مع طريقتين (methods) تستخدمان &self:

  • circumference — تعيد المحيط كـ f64 (الصيغة: 2.0 * 3.14159 * radius)
  • diameter — تعيد القطر كـ f64 (الصيغة: 2.0 * radius)

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

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

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

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

{circumference}
{diameter}

ورقة مرجعية

تصل الطرق (Methods) إلى بيانات الهيكل (struct) باستخدام المعامل &self، والذي يجب أن يكون الوسيط الأول. يعني الرمز & أن الطريقة تستعير المثيل بدلاً من أخذ ملكيته:

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 مع تدوين النقطة (dot notation) للوصول إلى حقول الهيكل. الطرق التي تستخدم &self هي للقراءة فقط ويمكنها فحص البيانات ولكن لا يمكنها تعديلها.

نظرًا لأن &self يستعير المثيل فقط، يمكنك استدعاء طرق متعددة على نفس الهيكل:

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

جرّب بنفسك

use std::io;

// TODO: قم بتعريف هيكل Circle هنا


// TODO: أضف كتلة التنفيذ لـ Circle مع دوال المحيط والقطر


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 واطبع المحيط والقطر
    
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming