دوال Getters
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 11 من 61.
مع الحقول الخاصة (private fields)، لا يمكن للكود الخارجي الوصول إلى بيانات الهيكل (struct) الخاص بك مباشرةً. ولكن في بعض الأحيان تحتاج إلى السماح للآخرين بقراءة البيانات دون منحهم القدرة على تغييرها. وهنا يأتي دور أساليب الجلب (getter methods).
المُجلب (getter) هو ببساطة دالة عامة (public method) تُرجع مرجعاً لحقل خاص (private field):
// 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 (وصول للقراءة فقط) وتعيد قيمة الحقل الخاص. في لغة Rust، عادةً ما تُسمى دوال الجلب (getters) باسم الحقل نفسه—لا حاجة لسابقة 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
}
تمنحك دوال الحصول (Getters) وصولاً منظماً للقراءة مع الحفاظ على الحقل نفسه محمياً. تظل الـ struct هي المسؤولة عن بياناتها؛ حيث يمكن للكود الخارجي الاطلاع عليها، لكن لا يمكنه تعديلها.
التحدي
سهللنقم ببناء نظام لملف تعريف المستخدم يوضح كيف توفر دوال الجلب (getter methods) وصولاً متحكماً فيه للقراءة للبيانات الخاصة.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
profile.rs: قم بتعريف هيكلUserProfileيحتوي على حقلين خاصين:username(String) وage(u32). يجب أن يكون الهيكل نفسه عاماً (public)، لكن يجب أن تظل الحقول خاصة. قم بتنفيذ منشئnewعام يأخذ اسم المستخدم والعمر. ثم أضف دالتين للجلب:username— تعيد مرجعاً لاسم المستخدم (&String)age— تعيد قيمة العمر (u32)
main.rs: قم باستيراد وحدة profile الخاصة بك، وأنشئUserProfile، واستخدم دوال الجلب لطباعة معلومات المستخدم.
تذكر أن دوال الجلب في Rust تسمى عادةً باسم الحقل نفسه — لا حاجة لسابقة get_. بالنسبة لحقول String، قم بإعادة مرجع لتجنب النسخ غير الضروري.
يجب أن يتبع مخرجك هذا التنسيق تماماً:
Username: {username}
Age: {age}على سبيل المثال، إذا قمت بإنشاء ملف تعريف باسم مستخدم "alice" وعمر 25، فسيكون المخرج:
Username: alice
Age: 25ستتلقى مدخلين: اسم المستخدم والعمر.
ورقة مرجعية
طريقة الجلب (getter method) هي طريقة عامة توفر وصولاً للقراءة فقط إلى حقل خاص.
تسمح طرق الجلب للكود الخارجي بعرض البيانات دون التمكن من تعديلها مباشرة:
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
في لغة Rust، يتم تسمية طرق الجلب باسم الحقل نفسه — لا حاجة لاستخدام البادئة get_.
بالنسبة للحقول التي تحتوي على بيانات مملوكة (owned data) مثل String، قم بإرجاع مرجع (reference) لتجنب النسخ غير الضروري:
pub fn name(&self) -> &String {
&self.name
}
استخدام طريقة الجلب:
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
جرّب بنفسك
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 باستخدام المنشئ (constructor)
// TODO: استخدم طرق الجلب (getter methods) لطباعة اسم المستخدم والعمر
// التنسيق:
// Username: {username}
// Age: {age}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 مع المعاملاتملخص - مشغل الوسائط