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.
Cairo mette a disposizione diversi meccanismi per la conversione di tipo:
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 permette la conversione da un tipo a un altro:
let value: u16 = 100;
let converted: u32 = value.into();
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"),
}
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 }
}
}
TryInto quando la conversione potrebbe fallire (ad esempio, da un tipo grande a uno piccolo)Into quando la conversione riesce sempreOption::None restituiti da TryInto
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.
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:
i32) in un intero senza segno (u16).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"
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
}
Iscriviti a Exercism per imparare e padroneggiare Cairo con 25 concetti68 esercizi e il mentoring di persone reali, tutto gratis.