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