Track
/
Cairo
Cairo
/
Esercizi
/
Misure magiche
Misure magiche

Misure magiche

Esercizio di apprendimento

Introduzione

Le conversioni di tipo in Cairo ti permettono di trasformare i dati da un tipo a un altro, consentendo una manipolazione dei dati flessibile e sicura.

Le basi

Cairo mette a disposizione diversi meccanismi per la conversione di tipo:

Cast diretto

Per i tipi numerici compatibili, puoi usare il cast diretto:

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

Il trait Into

Il trait Into permette la conversione da un tipo a un altro:

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

Il trait TryInto

Per le conversioni che potrebbero fallire, usa TryInto, che restituisce un 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"),
}

Conversioni di tipo personalizzate

Puoi implementare Into per i tuoi tipi:

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

Considerazioni sulla sicurezza

  • Usa TryInto quando la conversione potrebbe fallire (ad esempio, da un tipo grande a uno piccolo)
  • Usa Into quando la conversione riesce sempre
  • Gestisci sempre i casi Option::None restituiti da TryInto
  • Tieni conto di overflow e underflow quando converti tra tipi con segno e tipi senza segno

Istruzioni

Astrid, un'alchimista intraprendente, sta cercando di standardizzare le unità magiche di misura che raccoglie da regni diversi. Alcuni regni usano misure con segno (che possono essere negative), mentre altri usano misure senza segno (che sono sempre positive). In più, Astrid ha due tipi personalizzati per certi ingredienti rari, e le serve un modo per convertire facilmente tra questi tipi.

La tua missione è aiutare Astrid a convertire tra interi con segno e senza segno, e a creare conversioni personalizzate per i suoi tipi di ingredienti speciali usando i trait Into e TryInto di Cairo.

1. Convertire le unità magiche tra valori con segno e senza segno

Astrid ha misure che a volte hanno valori positivi o negativi (interi con segno), ma per alcune attività deve assicurarsi che i valori siano sempre positivi (interi senza segno).

Aiuta Astrid scrivendo una funzione che converte:

  1. Un intero con segno (i32) in un intero senza segno (u16).
  2. Un intero senza segno (u16) in un intero con segno (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. Conversione dei tipi di ingredienti personalizzati

Astrid lavora con due ingredienti rari, Essence e Elixir, rappresentati da tipi personalizzati. Vuole poter convertire Essence in Elixir, ma non il contrario.

Aiuta Astrid creando due tipi personalizzati, Essence e Elixir, e implementando il trait Into per convertire da Essence a Elixir.

Scrivi una funzione che accetta un Essence e lo converte in un Elixir usando .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
}
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Cairo Exercism

Vuoi iniziare Misure magiche?

Iscriviti a Exercism per imparare e padroneggiare Cairo con 25 concetti68 esercizi e il mentoring di persone reali, tutto gratis.