טרייטים של שוויון
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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, ולכן מקובל לגזור את שניהם יחד עבור טיפוסים שעומדים בתנאים.
אתגר
קלבואו נבנה מערכת להתאמת צבעים שמדגימה כיצד התכונות 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}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין