Menu
Coddy logo textTech

טרייטים של שוויון

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 38 מתוך 61.

השוואה בין שני מופעים של מבנה מותאם אישית באמצעות == לא עובדת כברירת מחדל ב-Rust. המהדר לא יודע לקבוע אם שני מבנים שווים. צריך לומר לו זאת באמצעות מימוש ה-trait 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);  // true
println!("{}", a == c);  // false

כאשר נגזרת, 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: השוו בין שני הצבעים באמצעות == והדפיסו: Colors match: {true/false}
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין