Tracks
/
Cairo
Cairo
/
Ejercicios
/
Mediciones mágicas
Mediciones mágicas

Mediciones mágicas

Ejercicio de aprendizaje

Introducción

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.

Conceptos básicos

Cairo ofrece varios mecanismos para convertir tipos:

Conversión directa

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

El trait Into permite convertir de un tipo a otro:

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

El trait TryInto

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

Conversiones de tipos personalizadas

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

Consideraciones de seguridad

  • Usa TryInto cuando la conversión podría fallar (por ejemplo, de tipos grandes a pequeños)
  • Usa Into cuando la conversión siempre tiene éxito
  • Maneja siempre los casos Option::None que devuelve TryInto
  • Ten en cuenta el desbordamiento y el subdesbordamiento al convertir entre tipos con signo y sin signo

Instrucciones

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.

1. Conversión de unidades mágicas entre enteros con signo y sin signo

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:

  1. Un entero con signo (i32) a un entero sin signo (u16).
  2. Un entero sin signo (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"

2. Conversión de tipos personalizados de ingredientes

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
}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Cairo Exercism

¿Todo listo para empezar Mediciones mágicas?

Regístrate en Exercism para aprender y dominar Cairo con 25 conceptos68 ejercicios y mentoría humana real, todo gratis.