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