Los punteros inteligentes en Cairo son estructuras de datos avanzadas que garantizan una gestión de memoria segura y eficiente al añadir características de seguridad a los punteros normales, evitando problemas comunes como desreferenciar punteros nulos o acceder a memoria no inicializada.
Un puntero inteligente se comporta como un puntero normal, pero hace un seguimiento de la propiedad y garantiza un acceso seguro a la memoria, lo que evita problemas como la desreferenciación de punteros nulos o colgantes.
Cairo proporciona 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 gestionar valores opcionales.Los punteros inteligentes ayudan a prevenir accesos inseguros a la memoria y garantizan que esta se libere automáticamente cuando ya no se necesita, lo que reduce el riesgo de fugas de memoria.
Box<T> para tipos recursivosLos punteros inteligentes como Box<T> permiten manejar tipos recursivos de forma segura, como en un árbol binario, asignando memoria de forma eficiente y evitando 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);
}
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);
}
En Chrono Realms, los Guardianes del Tiempo a menudo tratan no solo con árboles de líneas temporales, sino también con Cadenas Crono: secuencias de Nodos Temporales enlazados, cada uno representando un momento específico en el tiempo. Una Cadena Crono es un camino recto de momentos secuenciales, donde cada Nodo Temporal se conecta al siguiente. Estas Cadenas Crono son útiles al viajar a través de una serie de eventos específicos, ya que permiten a los Guardianes del Tiempo seguir una única línea temporal.
Sin embargo, para manejar estas Cadenas Crono potencialmente largas, los Guardianes del Tiempo usan punteros inteligentes (Box<t>)</t> para gestionar y recorrer de forma segura estas listas de momentos sin causar duplicación o desbordamiento de memoria innecesarios. Cada Nodo Temporal contiene una referencia al siguiente nodo, formando una estructura recursiva.
Tu tarea como aprendiz es implementar una Cadena Crono como una estructura de lista recursiva usando punteros inteligentes.
En este ejercicio, harás lo siguiente:
ChronoChain, que represente una lista de momentos.Box<T> para almacenar los nodos recursivos.ChronoChain a partir de un array de valores u32.ChronoChain y sumar los valores almacenados en la lista.ChronoChain recursivoCrea un enum recursivo ChronoChain con dos variantes:
End: Representa el final de la lista.Link: Contiene un valor u32 y una referencia empaquetada al siguiente nodo de la cadena.Escribe una función ChronoChain::build que tome un array de valores u32 y devuelva un ChronoChain, enlazando los valores secuencialmente mediante punteros inteligentes.
Escribe una función ChronoChain::sum para recorrer recursivamente el ChronoChain y sumar los valores de todos los nodos.
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);
}
Regístrate en Exercism para aprender y dominar Cairo con 25 conceptos68 ejercicios y mentoría humana real, todo gratis.