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

سمات المساواة

جزء من قسم البرمجة كائنية التوجه في رحلة 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، لذا من الشائع اشتقاق كليهما معًا للأنواع المؤهلة.

challenge icon

التحدي

سهل

لنبنِ نظامًا لمطابقة الألوان يوضّح كيف تُمكّن سماتا 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}
}
quiz iconاختبر نفسك

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

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

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