As conversões de tipo em Cairo permitem-te transformar dados de um tipo para outro, o que possibilita uma manipulação de dados flexível e segura.
O Cairo disponibiliza vários mecanismos de conversão de tipo:
Para tipos numéricos compatíveis, podes usar a conversão direta:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
Into
O trait Into permite converter um tipo noutro:
let value: u16 = 100;
let converted: u32 = value.into();
TryInto
Para conversões que podem falhar, usa TryInto, que devolve um 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"),
}
Podes implementar Into para os teus próprios tipos:
#[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 a conversão pode falhar (por exemplo, de tipos grandes para tipos pequenos)Into quando a conversão tem sempre sucessoOption::None do TryInto
A Astrid, uma alquimista aventureira, está a tentar normalizar as unidades de medida mágicas que recolhe de diferentes reinos. Alguns reinos usam medições com sinal (que podem ser negativas), enquanto outros usam medições sem sinal (que são sempre positivas). Além disso, a Astrid tem dois tipos personalizados para certos ingredientes raros e precisa de uma forma de converter facilmente entre esses tipos.
A tua missão é ajudar a Astrid a converter entre inteiros com e sem sinal, e criar conversões de tipos personalizados para os seus tipos de ingredientes especiais, usando os traits Into e TryInto do Cairo.
A Astrid tem medições que às vezes aparecem com valores positivos ou negativos (inteiros com sinal), mas, para certas tarefas, precisa de garantir que os valores são sempre positivos (inteiros sem sinal).
Ajuda a Astrid escrevendo uma função que converte:
i32) num inteiro sem sinal (u16).u16) num inteiro com sinal (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"
A Astrid trabalha com dois ingredientes raros, Essence e Elixir, que são representados por tipos personalizados. Quer conseguir converter Essence em Elixir, mas não o contrário.
Ajuda a Astrid a criar dois tipos personalizados, Essence e Elixir, e a implementar o trait Into para converter Essence em Elixir.
Escreve uma função que recebe uma Essence e a converte num 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
}
Inscreve-te no Exercism para aprenderes e dominares Cairo com 25 conceitos68 exercícios, e mentoria humana real, tudo grátis.