معامل 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 ولكن لا يمكنها تغييرها. في الدرس القادم، ستتعلم كيفية إنشاء طرق يمكنها تعديل النسخة.
التحدي
سهلأنشئ 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 واطبع المحيط والقطر
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط