Tracks
/
Cairo
Cairo
/
Ejercicios
/
La cadena temporal de Reinos del tiempo
La cadena temporal de Reinos del tiempo

La cadena temporal de Reinos del tiempo

Ejercicio de aprendizaje

Introducción

Los punteros inteligentes en Cairo son estructuras de datos avanzadas que garantizan una gestión segura y eficiente de la memoria, ya que añaden características de seguridad a los punteros normales y evitan problemas comunes como desreferenciar punteros nulos o acceder a memoria no inicializada.

¿Qué es un puntero inteligente?

Un puntero inteligente se comporta como un puntero normal, pero rastrea la propiedad y garantiza un acceso seguro a la memoria, lo que evita problemas como desreferenciar punteros nulos o colgantes.

Tipos de punteros inteligentes

Cairo ofrece varios tipos de punteros inteligentes, como Box<T> y Nullable<T>:

  • Box<T>: Almacena datos en un segmento de memoria especial, ideal para datos grandes o de tamaño dinámico. Permite transferir la propiedad sin copiar los datos.
  • Nullable<T>: Apunta a un valor válido de tipo T o a null, lo que resulta útil para manejar valores opcionales.

Seguridad de la memoria

Los punteros inteligentes ayudan a evitar accesos inseguros a la memoria, ya que garantizan que esta se libere automáticamente cuando ya no se necesita, lo que reduce el riesgo de fugas de memoria.

Ejemplo: usar Box<T> para tipos recursivos

Los punteros inteligentes como Box<T> permiten manejar de forma segura los tipos recursivos, como en un árbol binario, al asignar memoria de manera eficiente y evitar la recursión infinita.

use core::box::{BoxTrait};

#[derive(Copy, Drop)]
enum BinaryTree {
    Leaf: u32,
    Node: (u32, Box<BinaryTree>, Box<BinaryTree>),
}

fn main() {
    let leaf1 = BinaryTree::Leaf(1);
    let leaf2 = BinaryTree::Leaf(2);
    let node = BinaryTree::Node((3, BoxTrait::new(leaf1), BoxTrait::new(leaf2)));
    println!("{:?}", node);
}

Beneficios de rendimiento

Los punteros inteligentes mejoran el rendimiento al pasar referencias a los datos en lugar de copiar estructuras grandes, lo que reduce la sobrecarga de memoria.

// `Cart` is a large struct that contains a lot of information
fn pass_pointer(cart: Box<Cart>) {
    let cart = cart.unbox();
    println!("{} is shopping today and bought {} items", cart.buyer, cart.items);
}

Instrucciones

En Chrono Realms, los Time Keepers no solo trabajan con árboles de líneas temporales, sino también con Chrono Chains: secuencias de TimeNodes enlazados, y cada uno representa un momento específico en el tiempo. Una Chrono Chain es una ruta directa de momentos secuenciales, donde cada TimeNode se conecta con el siguiente. Estas Chrono Chains son útiles cuando se viaja a través de una serie de eventos específicos, ya que permiten a los Time Keepers seguir una sola línea temporal.

Sin embargo, para manejar estas Chrono Chains que pueden ser muy largas, los Time Keepers usan punteros inteligentes (Box<t>)</t> para gestionar y recorrer de forma segura estas listas de momentos sin provocar duplicación innecesaria de memoria ni desbordamiento. Cada TimeNode guarda una referencia al siguiente nodo, formando una estructura recursiva.

Tu tarea como aprendiz es implementar una Chrono Chain como una estructura de lista recursiva usando punteros inteligentes.

En este ejercicio vas a:

  1. Crear un enum recursivo ChronoChain que represente una lista de momentos.
  2. Usar el puntero inteligente Box<T> para almacenar los nodos recursivos.
  3. Implementar una función para crear una ChronoChain a partir de un array de valores u32.
  4. Implementar una función para recorrer la ChronoChain y sumar los valores almacenados en la lista.

1. Define el enum recursivo ChronoChain

Crea un enum recursivo ChronoChain con dos variantes:

  • End: representa el final de la lista.
  • Link: contiene un valor u32 y una referencia al siguiente nodo de la cadena dentro de un Box.

2. Crea una función para construir una ChronoChain

Escribe una función ChronoChain::build que tome un array de valores u32 y devuelva una ChronoChain, enlazando los valores de forma secuencial mediante punteros inteligentes.

3. Implementa la función de suma

Escribe una función ChronoChain::sum que recorra recursivamente la ChronoChain y sume los valores de todos los nodos.

Ejemplo de uso

fn main() {
    // Create a ChronoChain from an array of values
    let chrono_chain = ChronoChain::build(array![10, 20, 30]);

    // Sum the values in the ChronoChain
    let total_sum = chrono_chain.sum();

    println!("Total Time Power: {}", total_sum);
}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Cairo Exercism

¿Todo listo para empezar La cadena temporal de Reinos del tiempo?

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