Rutas
/
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 hace posible 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 un tipo en otro:

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

El trait TryInto

Para las conversiones que pueden 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 pueda fallar (por ejemplo, de tipos grandes a tipos pequeños)
  • Usa Into cuando la conversión siempre tenga éxito
  • Gestiona 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 poco comunes, 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. Convertir 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 sean siempre 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 de ingredientes personalizados

Astrid trabaja con dos ingredientes poco comunes, Essence y Elixir, que están representados por tipos personalizados. Quiere poder convertir Essence en Elixir, pero no al contrario.

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 pestaña nueva
Cairo Exercism

¿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.