Διαδρομές
/
Cairo
Cairo
/
Ασκήσεις
/
Μαγικές Μετρήσεις
Μαγικές Μετρήσεις

Μαγικές Μετρήσεις

Άσκηση εκμάθησης

Εισαγωγή

Οι μετατροπές τύπων στη Cairo σου επιτρέπουν να μετατρέπεις δεδομένα από έναν τύπο σε άλλον, κάνοντας τον χειρισμό των δεδομένων ευέλικτο και ασφαλή.

Τα βασικά

Η Cairo παρέχει αρκετούς μηχανισμούς για μετατροπή τύπων:

Άμεσο casting

Για συμβατούς αριθμητικούς τύπους, μπορείς να χρησιμοποιήσεις άμεσο casting:

let small_number: u8 = 42;
let big_number: u32 = small_number.into();

Το trait Into

Το trait Into επιτρέπει τη μετατροπή από έναν τύπο σε άλλον:

let value: u16 = 100;
let converted: u32 = value.into();

Το trait TryInto

Για μετατροπές που μπορεί να αποτύχουν, χρησιμοποίησε το TryInto, το οποίο επιστρέφει ένα Option:

let large_value: u32 = 70000;
let small_value: Option<u16> = large_value.try_into();

match small_value {
    Option::Some(v) => println!("Converted: {}", v),
    Option::None => println!("Conversion failed"),
}

Προσαρμοσμένες μετατροπές τύπων

Μπορείς να υλοποιήσεις το Into για δικούς σου τύπους:

#[derive(Drop)]
struct Celsius {
    value: i32,
}

#[derive(Drop)]
struct Fahrenheit {
    value: i32,
}

impl CelsiusIntoFahrenheit of Into<Celsius, Fahrenheit> {
    fn into(self: Celsius) -> Fahrenheit {
        Fahrenheit { value: (self.value * 9) / 5 + 32 }
    }
}

Θέματα ασφάλειας

  • Χρησιμοποίησε το TryInto όταν η μετατροπή μπορεί να αποτύχει (π.χ. από μεγάλους σε μικρούς τύπους)
  • Χρησιμοποίησε το Into όταν η μετατροπή πετυχαίνει πάντα
  • Να χειρίζεσαι πάντα τις περιπτώσεις Option::None που προκύπτουν από το TryInto
  • Λάβε υπόψη την υπερχείλιση και την υποχείλιση όταν μετατρέπεις μεταξύ προσημασμένων και απρόσημων τύπων

Οδηγίες

Η Astrid, μια τολμηρή αλχημίστρια, προσπαθεί να τυποποιήσει τις μαγικές μονάδες μέτρησης που συλλέγει από διάφορα βασίλεια. Κάποια βασίλεια χρησιμοποιούν προσημασμένες μετρήσεις (που μπορεί να είναι αρνητικές), ενώ άλλα χρησιμοποιούν απρόσημες (που είναι πάντα θετικές). Επιπλέον, η Astrid έχει δύο προσαρμοσμένους τύπους για ορισμένα σπάνια συστατικά και χρειάζεται έναν τρόπο να μετατρέπει εύκολα από τον έναν τύπο στον άλλο.

Η αποστολή σου είναι να βοηθήσεις την Astrid να μετατρέπει προσημασμένους και απρόσημους ακεραίους και να δημιουργήσεις μετατροπές προσαρμοσμένων τύπων για τους ειδικούς τύπους συστατικών της, χρησιμοποιώντας τα trait Into και TryInto της Cairo.

1. Μετατροπή μαγικών μονάδων μεταξύ προσημασμένων και απρόσημων

Η Astrid έχει μετρήσεις που μερικές φορές έχουν θετικές ή αρνητικές τιμές (προσημασμένοι ακέραιοι), αλλά για ορισμένες εργασίες χρειάζεται να διασφαλίζει ότι οι τιμές είναι πάντα θετικές (απρόσημοι ακέραιοι).

Βοήθησε την Astrid γράφοντας μια συνάρτηση που μετατρέπει:

  1. Έναν προσημασμένο ακέραιο (i32) σε έναν απρόσημο ακέραιο (u16).
  2. Έναν απρόσημο ακέραιο (u16) σε έναν προσημασμένο ακέραιο (i32).
let signed_value: i32 = -42;
match convert_signed_to_unsigned(signed_value) {
    Option::Some(v) => println!("Converted to unsigned: {}", v),
    Option::None => println!("Failed to convert: {}", signed_value),
} // prints "Failed to convert: -42"

let unsigned_value: u16 = 42;
let signed_value: i32 = convert_unsigned_to_signed(unsigned_value);
println!("Converted to signed: {}", signed_value); // prints "Converted to signed: 42"

2. Μετατροπή προσαρμοσμένων τύπων συστατικών

Η Astrid δουλεύει με δύο σπάνια συστατικά, Essence και Elixir, που τα αντιπροσωπεύουν προσαρμοσμένοι τύποι. Θέλει να μπορεί να μετατρέπει Essence σε Elixir, αλλά όχι και αντίστροφα.

Βοήθησε την Astrid δημιουργώντας δύο προσαρμοσμένους τύπους, Essence και Elixir, και υλοποιώντας το trait Into για μετατροπή από Essence σε Elixir.

Γράψε μια συνάρτηση που δέχεται Essence και το μετατρέπει σε Elixir χρησιμοποιώντας το .into().

#[derive(Drop)]
struct Essence {
    potency: u16,
}

#[derive(Drop)]
struct Elixir {
    strength: u16,
}

fn convert_essence_to_elixir(essence: Essence) -> Elixir {
    // Convert the Essence to Elixir using the Into trait.
    essence.into()
}

fn main() {
    let essence = Essence { potency: 100 };
    let elixir: Elixir = convert_essence_to_elixir(essence);
    println!("Elixir strength: {}", elixir.strength); // Elixir strength: 100
}
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Cairo Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μαγικές Μετρήσεις;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Cairo με 25 έννοιες68 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.