שיעורי מודול (1/2)
כללי ופונקציות
גנריות מאפשרות לך לכתוב קוד גמיש וניתן לשימוש חוזר, תוך הימנעות שכפול של לוגיקה עבור סוגי נתונים שונים. במקום להגדיר מספר פונקציות או מבנים עבור סוגים שונים (כמו i32, f64, או String), אנו יכולים להשתמש בפרמטר סוג גנרי, המיוצג באופן קונבנציונלי באות T.
מהדר Rust מנהל גנריות באמצעות תהליך הנקרא מונומורפיזציה: במהלך ההידור, הוא יוצר עותק של הקוד הגנרי עבור כל סוג בטון שבו נעשה שימוש בפועל. המשמעות היא שיש אפס ביצועי זמן ריצה.
פונקציות כלליות
כדי להגדיר פונקציה כללית, נכניס את פרמטר הסוג <T> מיד אחרי שם הפונקציה ולפני רשימת הארגומנטים:
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}בפונקציות גנריות, אנו יכולים להשתמש בסוג הגנרי T הן עבור סוגי ארגומנטים והן עבור סוגי החזרה:
fn identity<T>(value: T) -> T {
value
}מבנים גנריים
אנו יכולים גם להשתמש בפרמטרי סוג גנריים בתוך מבנים (struct) כדי להגדיר שדות גמישים:
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}בבלוק impl עבור מבנה גנרי, עלינו להכריז על פרמטר הסוג <T> מיד אחרי מילת המפתח impl כדי לציין שאנו מיישמים שיטות על מבנה גנרי:
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}נסה זאת בעצמך
תרגיל 1: מבנה הנקודות
הגדר מבנה גנרי בשם Point<T> עם שני שדות: x מסוג T ו-y מסוג T. בפונקציה הראשית, הצג נקודה משתנה המכילה Point עם ערכי מספר שלמים x = 5 ו-y = 10, ולאחר מכן הדפס את הערך של point.x.
הצג רמז
הכריז על המבנה באמצעות `struct Point<T> { x: T, y: T }`. הפעל אותו ב-main והשתמש ב-'point.x' כדי להדפיס אותו.
הפתרון זמין לאחר 3 ניסיונות
תרגיל 2: היפוך טופל עם החלפה
כתוב פונקציה גנרית בשם swap<T> שמקבלת טופלה של שני אלמנטים (T,T) ומחזירה טופלה חדשה (T,T) כשהמיקומים שלהם הפוכים. בפונקציה הראשית, קרא לפונקציה עם tuple (1, 2) והדפיס את התוצאה.
הצג רמז
חתימת הפונקציה חייבת להיות `fn swap<T>(זוג: (T,T)) -> (T,T)`. החזר את הטפול ההפוך עם `(זוג.1, זוג.0)`.
הפתרון זמין לאחר 3 ניסיונות
תרגיל 3: מבנה המכולה
הגדר מבנה גנרי Container<T> המכיל שדה ערך מסוג T. יישם בלוק impl גנרי כדי להגדיר שיטה חדשה המקבלת ערך מסוג T ומחזירה מופע של Container<T>.
הצג רמז
השתמש ב-`impl<T> Container<T>`כדי ליישם את השיטה המשויכת`fn new(value: T) -> Self { Container { value } }`.
הפתרון זמין לאחר 3 ניסיונות