Tracks
/
Cairo
Cairo
/
Übungen
/
Magische Messungen
Magische Messungen

Magische Messungen

Lernübung

Einführung

Typumwandlungen in Cairo ermöglichen es dir, Daten von einem Typ in einen anderen umzuwandeln. Das erlaubt eine flexible und sichere Datenmanipulation.

Grundlagen

Cairo bietet mehrere Mechanismen für die Typumwandlung:

Direktes Casting

Bei kompatiblen numerischen Typen kannst du direktes Casting verwenden:

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

Das Into-Trait

Das Into-Trait ermöglicht die Umwandlung von einem Typ in einen anderen:

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

Das TryInto-Trait

Für Umwandlungen, die fehlschlagen können, verwende TryInto, das eine Option zurückgibt:

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"),
}

Eigene Typumwandlungen

Du kannst Into für deine eigenen Typen implementieren:

#[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 }
    }
}

Sicherheitsaspekte

  • Verwende TryInto, wenn die Umwandlung fehlschlagen kann (z. B. von großen zu kleinen Typen)
  • Verwende Into, wenn die Umwandlung immer gelingt
  • Behandle immer die Option::None-Fälle von TryInto
  • Achte auf Überlauf und Unterlauf, wenn du zwischen vorzeichenbehafteten und vorzeichenlosen Typen umwandelst

Anleitung

Astrid, eine abenteuerlustige Alchemistin, versucht, die magischen Maßeinheiten zu standardisieren, die sie aus verschiedenen Reichen sammelt. Einige Reiche verwenden vorzeichenbehaftete Maßeinheiten (die negativ sein können), während andere vorzeichenlose verwenden (die immer positiv sind). Außerdem hat Astrid zwei eigene Typen für bestimmte seltene Zutaten, und sie braucht eine Möglichkeit, einfach zwischen diesen Typen umzuwandeln.

Deine Mission ist es, Astrid dabei zu helfen, zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlen umzuwandeln und eigene Typumwandlungen für ihre speziellen Zutatentypen zu erstellen, und zwar mit den Into- und TryInto-Traits von Cairo.

1. Magische Einheiten zwischen vorzeichenbehaftet und vorzeichenlos umwandeln

Astrid hat Messwerte, die manchmal positive oder negative Werte haben (vorzeichenbehaftete Ganzzahlen), aber für bestimmte Aufgaben muss sie sicherstellen, dass die Werte immer positiv sind (vorzeichenlose Ganzzahlen).

Hilf Astrid, indem du eine Funktion schreibst, die Folgendes umwandelt:

  1. Eine vorzeichenbehaftete Ganzzahl (i32) in eine vorzeichenlose Ganzzahl (u16).
  2. Eine vorzeichenlose Ganzzahl (u16) in eine vorzeichenbehaftete Ganzzahl (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. Umwandlung eigener Zutatentypen

Astrid arbeitet mit zwei seltenen Zutaten, Essence und Elixir, die durch eigene Typen dargestellt werden. Sie möchte Essence in Elixir umwandeln können, aber nicht umgekehrt.

Hilf Astrid, indem du zwei eigene Typen erstellst, Essence und Elixir, und den Into-Trait implementierst, um von Essence nach Elixir umzuwandeln.

Schreibe eine Funktion, die eine Essence entgegennimmt und sie mit .into() in ein Elixir umwandelt.

#[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
}
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Cairo Exercism

Bereit, mit Magische Messungen zu starten?

Melde dich bei Exercism an, um Cairo mit 25 Konzepte68 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.