Las conversiones de tipos en Cairo te permiten transformar datos de un tipo a otro, lo que habilita una manipulación de datos flexible y segura.
Cairo ofrece varios mecanismos para convertir tipos:
Para tipos numéricos compatibles, puedes usar la conversión directa:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
El trait Into permite convertir de un tipo a otro:
let value: u16 = 100;
let converted: u32 = value.into();
Para conversiones que podrían fallar, usa TryInto, que devuelve 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"),
}
Puedes implementar Into para tus propios 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 cuando la conversión podría fallar (por ejemplo, de tipos grandes a pequeños)Into cuando la conversión siempre tiene éxitoOption::None que devuelve TryInto
Astrid, una alquimista aventurera, está intentando estandarizar las unidades mágicas de medida que recoge de distintos reinos. Algunos reinos usan medidas con signo (que pueden ser negativas), mientras que otros usan medidas sin signo (que siempre son positivas). Además, Astrid tiene dos tipos personalizados para ciertos ingredientes raros, y necesita una forma de convertir fácilmente entre estos tipos.
Tu misión es ayudar a Astrid a convertir entre enteros con signo y sin signo, y crear conversiones de tipos personalizadas para sus tipos de ingredientes especiales usando los traits Into y TryInto de Cairo.
Astrid tiene medidas que a veces vienen en valores positivos o negativos (enteros con signo), pero para ciertas tareas, necesita asegurarse de que los valores siempre sean positivos (enteros sin signo).
Ayuda a Astrid escribiendo una función que convierta:
i32) a un entero sin signo (u16).u16) a un entero con signo (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 trabaja con dos ingredientes raros, Essence y Elixir, que están representados por tipos personalizados. Quiere poder convertir Essence en Elixir, pero no al revés.
Ayuda a Astrid creando dos tipos personalizados, Essence y Elixir, e implementando el trait Into para convertir de Essence a Elixir.
Escribe una función que acepte un Essence y lo convierta en 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
}
Regístrate en Exercism para aprender y dominar Cairo con 25 conceptos68 ejercicios y mentoría humana real, todo gratis.