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

دوال Getters

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

مع الحقول fields الخاصة (private)، لا يستطيع الكود الخارجي الوصول مباشرةً إلى بيانات struct الخاصة بك. لكن أحيانًا تحتاج إلى السماح للآخرين بـ read البيانات دون منحهم القدرة على تغييرها. وهنا يأتي دور getter methods.

إن دالة getter هي ببساطة دالة public تُعيد مرجعًا إلى حقل private:

// wallet.rs
pub struct Wallet {
    balance: f64,
}

impl Wallet {
    pub fn new(initial: f64) -> Wallet {
        Wallet { balance: initial }
    }
    
    pub fn balance(&self) -> f64 {
        self.balance
    }
}

تأخذ طريقة balance()&self (وصولًا للقراءة فقط) وتُرجع قيمة الحقل ‏private. في Rust، تُسمّى getter عادةً باسم الحقل نفسه: لا حاجة إلى بادئة get_.

يمكن للكود الخارجي الآن قراءة الرصيد من خلال الطريقة:

// main.rs
mod wallet;
use wallet::Wallet;

fn main() {
    let w = Wallet::new(100.0);
    println!("Balance: {}", w.balance());  // يعمل!
}

بالنسبة إلى الحقول التي تحتوي على بيانات مملوكة مثل String، ستُرجع غالبًا مرجعًا لتجنّب النسخ غير الضروري:

pub fn name(&self) -> &String {
    &self.name
}

تمنحك دوال getter وصولًا مقيدًا للقراءة مع إبقاء الحقل نفسه محميًا. وتظل البنية struct مسؤولة عن بياناتها: يمكن للكود الخارجي الاطلاع عليها، لكنه لا يستطيع تعديلها.

challenge icon

التحدي

سهل

لنبنِ نظامًا لملف تعريف المستخدم يوضّح كيفية توفير دوال getter وصولًا مضبوطًا للقراءة إلى البيانات private.

ستن created ملفين لتنظيم التعليمات البرمجية:

  • profile.rs: عرّف بنية UserProfile تحتوي على حقلين private: username (String) وage (u32). يجب أن تكون البنية نفسها public، بينما تظل الحقول private. Implement مُنشئًا public باسم new يأخذ username وage. ثم أضف دالتي getter:
    • username: تُرجع مرجعًا إلى username (&String)
    • age: تُرجع قيمة age (u32)
  • main.rs: استورد وحدة profile، وأنشئ UserProfile، واستخدم دوال getter لطباعة معلومات المستخدم.

تذكّر أن دوال getter في Rust تُسمّى عادةً باسم الحقل نفسه: لا حاجة إلى بادئة get_. بالنسبة إلى حقول String، أعد مرجعًا لتجنّب النسخ غير الضروري.

يجب أن يتبع ناتجك هذا التنسيق الدقيق:

Username: {username}
Age: {age}

على سبيل المثال، إذا أنشأت ملف تعريف باستخدام username "alice" وage 25، فسيكون الناتج:

Username: alice
Age: 25

ستتلقى مدخلين: username وage.

جرّب بنفسك

mod profile;

use profile::UserProfile;

fn main() {
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let username = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let age: u32 = input2.trim().parse().expect("Failed to parse age");

    // TODO: أنشئ UserProfile باستخدام المُنشئ

    // TODO: استخدم دوال الـ getter لطباعة username و age
    // التنسيق:
    // Username: {username}
    // العمر: {age}
}
quiz iconاختبر نفسك

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

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

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