سمات المساواة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 38 من 61.
لا تعمل مقارنة مثيلين من struct مخصّص باستخدام == بشكل افتراضي في Rust. لا يعرف المترجم كيفية تحديد ما إذا كان هيكلان متساويين. عليك إخباره بذلك من خلال تنفيذ سمة PartialEq.
مثل Debug وCopy، يمكنك اشتقاق PartialEq تلقائيًا:
#[derive(PartialEq)]
struct Coordinate {
x: i32,
y: i32,
}
let a = Coordinate { x: 5, y: 10 };
let b = Coordinate { x: 5, y: 10 };
let c = Coordinate { x: 3, y: 7 };
println!("{}", a == b); // صحيح
println!("{}", a == c); // خطأ
عند اشتقاق PartialEq، تتم مقارنة كل حقل من حقول البنية. تكون المثيلتان متساويتين فقط إذا تطابقت جميع حقولهما المتناظرة.
ستواجه أيضًا Eq، وهي سمة مؤشِّر تشير إلى المساواة التامة، ما يعني أن كل قيمة تساوي نفسها. تستوفي معظم الأنواع هذا الشرط، لكن أعداد الفاصلة العائمة لا تستوفيه (لأن NaN != NaN). بالنسبة إلى البُنى التي تحتوي على حقول صحيحة، يمكنك اشتقاق كليهما بأمان:
#[derive(PartialEq, Eq)]
struct Coordinate {
x: i32,
y: i32,
}
لا تحتوي Eq على أساليب خاصة بها. فهي تشير ببساطة إلى أن النوع يتمتع بالمساواة الانعكاسية. تتطلب بعض ميزات المكتبة القياسية Eq بالإضافة إلى PartialEq، لذا من الشائع اشتقاق كليهما معًا للأنواع المؤهلة.
التحدي
سهللنبنِ نظامًا لمطابقة الألوان يوضّح كيف تُمكّن سماتا PartialEq وEq من المقارنة بين مثيلات البُنى!
ستنشئ ملفين لتنظيم منطق مقارنة الألوان:
color.rs: عرّف بُنيةColorعامة بثلاثة حقول عامة:redوgreenوblue(وكلها من النوعu8). اشتقّ كلاً منPartialEqوEqحتى يمكن مقارنة لونين باستخدام==. عند اشتقاقهما، ستعتبر Rust لونين متساويين فقط إذا تطابقت مكوّنات RGB الثلاثة تمامًا.main.rs: أدرج وحدة الألوان وأنشئ مثيلين منColorباستخدام المدخلات المقدَّمة. قارنهما باستخدام==واطبع ما إذا كانا متطابقين أم لا.
يجب أن يوضّح ناتجك ما إذا كان اللونان متماثلين:
Color 1: rgb({r1}, {g1}, {b1})
Color 2: rgb({r2}, {g2}, {b2})
Colors match: {true/false}على سبيل المثال، باستخدام المدخلات 255 و128 و0 و255 و128 و0:
Color 1: rgb(255, 128, 0)
Color 2: rgb(255, 128, 0)
Colors match: trueوباستخدام المدخلات 100 و100 و100 و200 و200 و200:
Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: falseستتلقى ستة مدخلات: قيم RGB للون الأول (ثلاث قيم)، متبوعة بقيم RGB للون الثاني (ثلاث قيم). حلّل كل قيمة باعتبارها u8.
جرّب بنفسك
mod color;
use color::Color;
fn main() {
// اقرأ قيم RGB الست
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let r1: u8 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let g1: u8 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let b1: u8 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let r2: u8 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let g2: u8 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let b2: u8 = input.trim().parse().expect("Invalid input");
// TODO: أنشئ مثيلين من Color باستخدام القيم المحللة
// TODO: اطبع Color 1 بالتنسيق: Color 1: rgb(r, g, b)
// TODO: اطبع Color 2 بالتنسيق: Color 2: rgb(r, g, b)
// TODO: Compare the two colors using == and print: Colors match: {true/false}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت