Οι μετατροπές τύπων στη Cairo σου επιτρέπουν να μετατρέπεις δεδομένα από έναν τύπο σε άλλον, κάνοντας τον χειρισμό των δεδομένων ευέλικτο και ασφαλή.
Η Cairo παρέχει αρκετούς μηχανισμούς για μετατροπή τύπων:
Για συμβατούς αριθμητικούς τύπους, μπορείς να χρησιμοποιήσεις άμεσο casting:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
Into
Το trait Into επιτρέπει τη μετατροπή από έναν τύπο σε άλλον:
let value: u16 = 100;
let converted: u32 = value.into();
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.
Η Astrid έχει μετρήσεις που μερικές φορές έχουν θετικές ή αρνητικές τιμές (προσημασμένοι ακέραιοι), αλλά για ορισμένες εργασίες χρειάζεται να διασφαλίζει ότι οι τιμές είναι πάντα θετικές (απρόσημοι ακέραιοι).
Βοήθησε την Astrid γράφοντας μια συνάρτηση που μετατρέπει:
i32) σε έναν απρόσημο ακέραιο (u16).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"
Η 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
}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Cairo με 25 έννοιες68 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.