Menu
Coddy logo textTech

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 צריכה לדעת לאיזה טיפוס ממירים. הדפוס הזה שימושי במיוחד כשיש לך מבני עזר שצריך להמיר לטיפוסים הראשיים שלך, כמו המרת נתוני תצורה לאובייקט מאותחל או הפיכת קלט גולמי למבנה נתונים שעבר אימות.

challenge icon

אתגר

קל

בואו נבנה מערכת להמרת טמפרטורות באמצעות ה-trait From! תיצרו שני סוגי טמפרטורה, Celsius ו-Fahrenheit, ותממשו המרות ביניהם באמצעות ה-traits הסטנדרטיים של Rust להמרות.

תארגנו את הקוד בשני קבצים:

  • temperature.rs: הגדירו שני מבני newtype ציבוריים, Celsius ו-Fahrenheit, ששניהם עוטפים ערך f64. ממשו את ה-trait From כדי להמיר 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
}
quiz iconבחנו את עצמכם

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

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

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