From ו-Into
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 57 מתוך 61.
המרה בין טיפוסים היא משימה נפוצה ב-Rust. ה-trait From מספק דרך סטנדרטית להגדיר כיצד ניתן ליצור טיפוס אחד מטיפוס אחר. כשמממשים את From, מקבלים באופן אוטומטי וללא עלות את ה-trait Into.
כדי לממש את From, מגדירים איך לבנות את הטיפוס שלך מטיפוס אחר:
struct Meters(f64);
struct Kilometers(f64);
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * 1000.0)
}
}
כעת אפשר לבצע המרה באמצעות הפונקציה from או המתודה into:
let distance = Kilometers(5.0);
// שימוש מפורש ב-From
let m1 = Meters::from(distance);
// שימוש ב-Into (פועל כי From ממומש)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
המתודה into() דורשת ציון טיפוס, מכיוון ש-Rust צריכה לדעת לאיזה טיפוס ממירים. הדפוס הזה שימושי במיוחד כשיש לך מבני עזר שצריך להמיר לטיפוסים הראשיים שלך, כמו המרת נתוני תצורה לאובייקט מאותחל או הפיכת קלט גולמי למבנה נתונים שעבר אימות.
אתגר
קלבואו נבנה מערכת להמרת טמפרטורות באמצעות ה-trait From! תיצרו שני סוגי טמפרטורה, Celsius ו-Fahrenheit, ותממשו המרות ביניהם באמצעות ה-traits הסטנדרטיים של Rust להמרות.
תארגנו את הקוד בשני קבצים:
temperature.rs: הגדירו שני מבני newtype ציבוריים,Celsiusו-Fahrenheit, ששניהם עוטפים ערךf64. ממשו את ה-traitFromכדי להמירCelsiusל-Fahrenheitבאמצעות הנוסחה:fahrenheit = celsius × 1.8 + 32.0. הוסיפו גם מתודתvalueלכל מבנה, שמחזירה את הערך הפנימי מסוגf64.main.rs: כללו את מודול הטמפרטורה שלכם והדגימו את שתי דרכי ההמרה. צרו ערךCelsiusמהקלט שסופק, ואז המירו אותו ל-FahrenheitבאמצעותFahrenheit::from(). צרו ערךCelsiusנוסף והמירו אותו באמצעות המתודה.into(). הדפיסו את שתי התוצאות.
נוסחת ההמרה מצלזיוס לפרנהייט היא: הכפילו ב-1.8 והוסיפו 32. זכרו שמימוש From<Celsius> for Fahrenheit מעניק לכם באופן אוטומטי את ה-trait Into<Fahrenheit> עבור Celsius בחינם!
שתי הטמפרטורות מודפסות כמספרים שלמים: בצעו המרה של כל f64 באמצעות as i64, פעולה שמסירה את הספרות העשרוניות לכיוון אפס. לכן, קלט של 36.6 יודפס בתור 36C, ו-97.88 מעלות פרנהייט שאליהן הוא מומר יודפסו בתור 97F. שום ערך אינו מעוגל כלפי מעלה.
הפלט שלכם צריך להציג את שתי ההמרות בפורמט הזה:
From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}Fלדוגמה, עם הקלטים 0 ו-100:
From: 0C = 32F
Into: 100C = 212Fועם הקלטים 25 ו--40:
From: 25C = 77F
Into: -40C = -40Fתקבלו שני קלטים: ערך הצלזיוס הראשון (יש לנתח אותו כ-f64) וערך הצלזיוס השני (יש לנתח אותו כ-f64).
נסו בעצמכם
mod temperature;
use temperature::{Celsius, Fahrenheit};
fn main() {
// קרא את הקלט
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let celsius1: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let celsius2: f64 = input2.trim().parse().expect("Invalid number");
// TODO: צור ערך Celsius מ־celsius1
// TODO: המר אותו ל־Fahrenheit באמצעות Fahrenheit::from()
// TODO: צור ערך Celsius נוסף מ־celsius2
// TODO: המר אותו ל־Fahrenheit באמצעות .into()
// TODO: הדפס את התוצאות בפורמט:
// From: {celsius1}C = {fahrenheit1}F
// Into: {celsius2}C = {fahrenheit2}F
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין