Menu
CoddyTech

الـ Methods العامة

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

يمكن للبنية العامة أن تحتوي على أي نوع، لكنها ليست مفيدة جدًا من دون طرائق للتفاعل مع بياناتها. لتعريف طرائق لبنية عامة، تحتاج إلى صياغة خاصة في كتلة impl.

المفتاح هو التصريح بالمعامل العام على impl نفسه:

struct Wrapper<T> {
    value: T,
}

impl<T> Wrapper<T> {
    fn get(&self) -> &T {
        &self.value
    }
}

لاحظ impl<T> قبل Wrapper<T>. يخبر هذا Rust بأن T معلمة نوع عامة لكتلة التنفيذ بأكملها. من دون هذا التصريح، سيبحث Rust عن نوع محدد اسمه T ولن يعثر عليه.

تعيد الطريقة get القيمة &T: مرجعًا إلى أي نوع يحتفظ به الغلاف. يعمل هذا سواء كان T عددًا صحيحًا أو سلسلة نصية أو أي نوع آخر:

let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };

println!("{}", num_wrapper.get());  // 100
println!("{}", text_wrapper.get()); // Rust

يعمل تعريف الطريقة نفسه مع كليهما، لأن النوع العام T يتكيف مع كل نوع ملموس في وقت الترجمة.

challenge icon

التحدي

سهل

لنوسّع الحاوية العامة بإضافة طرائق إليها! ستنشئ بنية Box (ولا ينبغي الخلط بينها وبين Box القياسية في Rust) يمكنها احتواء أي نوع، وتوفّر طرائق للتعامل مع محتوياتها.

ستنظّم شيفرتك في ملفين:

  • mybox.rs: عرّف بنية عامة مكشوفة باسم MyBox<T> تحتوي على حقل خاص contents من النوع T. نفّذ طرائق لهذه البنية:
    • دالة مرتبطة باسم new تنشئ MyBox جديدة بالقيمة المعطاة
    • طريقة باسم peek تُعيد مرجعًا إلى المحتويات (باستخدام &self)
    • طريقة باسم replace تأخذ قيمة جديدة وتستبدل المحتويات الحالية (باستخدام &mut self)
  • main.rs: أدرج وحدتك ووضّح عمل الطرائق العامة مع أنواع مختلفة. ستنشئ صناديق، وتعاين محتوياتها، وتستبدل القيم لإظهار عمل الطرائق.

تذكّر الصياغة الأساسية لتنفيذ طرائق على بنية عامة: تحتاج إلى impl<T> قبل MyBox<T> لإخبار Rust بأن T معلمة عامة لكتلة التنفيذ بأكملها.

في ملفك الرئيسي، وضّح استخدام MyBox من خلال:

  1. إنشاء صندوق يحتوي على عدد صحيح (المدخل الأول، بعد تحليله كـ i32)
  2. معاينة محتوياته وطباعة القيمة
  3. استبدال محتوياته بعدد صحيح جديد (المدخل الثاني، بعد تحليله كـ i32)
  4. معاينته مرة أخرى لإظهار القيمة المحدّثة
  5. إنشاء صندوق ثانٍ يحتوي على سلسلة نصية (المدخل الثالث)
  6. معاينة محتويات صندوق السلسلة النصية

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

Integer box contains: {value}
After replace: {value}
String box contains: {value}

على سبيل المثال، مع المدخلات 10 و25 وRust:

Integer box contains: 10
After replace: 25
String box contains: Rust

ستتلقى ثلاثة مدخلات: عددًا صحيحًا أوليًا، وعددًا صحيحًا بديلًا، وقيمة سلسلة نصية.

جرّب بنفسك

mod mybox;

use mybox::MyBox;

fn main() {
    // اقرأ المدخلات
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let initial_int: i32 = input1.trim().parse().expect("Invalid integer");

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

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let string_value = input3.trim().to_string();

    // TODO: أنشئ MyBox بالعدد الصحيح الأولي
    
    // TODO: اطّلع على محتوياته واطبع: "Integer box contains: {value}"
    
    // TODO: استبدل المحتويات بالعدد الصحيح البديل
    
    // TODO: اطّلع عليها مرة أخرى واطبع: "After replace: {value}"
    
    // TODO: أنشئ MyBox ثانية بالقيمة النصية
    
    // TODO: اطّلع على محتويات الصندوق النصي واطبع: "String box contains: {value}"
}
quiz iconاختبر نفسك

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

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

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