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

سمة Display

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

بينما تُعدّ Debug رائعة للمطورين الذين يفحصون البيانات، فإن سمة Display مصممة من أجل المخرجات الموجّهة للمستخدم. وهي التي تُشغّل المنسّق {} في println!. وعلى عكس Debug، لا تستطيع Rust اشتقاق Display تلقائيًا. يجب عليك تنفيذها يدويًا.

لتنفيذ Display، تحتاج إلى استيراد الوحدة fmt وتنفيذ الأسلوب fmt:

use std::fmt;

struct Temperature {
    celsius: f64,
}

impl fmt::Display for Temperature {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}°C", self.celsius)
    }
}

تستقبل طريقة fmt كائنًا من نوع Formatter وتُرجع fmt::Result. تستخدم ماكرو write! لتنسيق مخرجاتك، مع الوصول إلى حقول البنية من خلال self.

يمكنك الآن طباعة البنية باستخدام المُنسِّق القياسي {}:

let temp = Temperature { celsius: 23.5 };
println!("{}", temp);  // 23.5°C

الفرق الأساسي: يُظهر ناتج Debug بنية بياناتك (وهو مفيد لتصحيح الأخطاء)، بينما يكون ناتج Display مصقولًا ومخصصًا للمستخدمين النهائيين. يمكن لـ struct تنفيذ كليهما: استخدم {:?} لتصحيح الأخطاء و{} للحصول على ناتج واضح.

challenge icon

التحدي

سهل

لننشئ نظامًا سهل الاستخدام لعرض المنتجات! بينما يعرض Debug البنية الخام لبياناتك، تتيح لك سمة Display صياغة مخرجات مصقولة وقابلة للقراءة للبشر، وهي مثالية للمستخدمين النهائيين.

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

  • product.rs: عرّف بنية Product عامة تحتوي على حقلين عامّين: name (String) وprice (f64). طبّق سمة Display على بنيتك بحيث تُنسّق بالشكل {name} - ${price}. تذكّر استيراد std::fmt واستخدام الماكرو write! داخل أسلوب fmt.
  • main.rs: استورد وحدة المنتج وأنشئ مثيلًا من Product باستخدام المدخلات المقدَّمة. اطبع المنتج باستخدام المُنسّق القياسي {} لعرض مخرجات العرض المخصّصة.

تتطلب سمة Display منك تنفيذ أسلوب fmt يدويًا: لا يستطيع Rust اشتقاقه تلقائيًا مثل Debug. يمنحك هذا تحكمًا كاملًا في كيفية ظهور نوعك للمستخدمين.

يجب أن تعرض مخرجاتك المنتج بتنسيق واضح وسهل الاستخدام:

{name} - ${price}

على سبيل المثال، عند استخدام المدخلين Wireless Mouse و29.99:

Wireless Mouse - $29.99

ستتلقى مدخلين: اسم المنتج والسعر (حلّله كنوع f64).

تنسيق الإخراج المطلوب: [المحتوى المترجم هنا]

جرّب بنفسك

mod product;

use product::Product;

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

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: أنشئ مثيل Product بالاسم والسعر

    // TODO: اطبع المنتج باستخدام منسّق {}
}
quiz iconاختبر نفسك

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

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

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