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.
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.
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.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.
Box<T> para tipos recursivosLos 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);
}
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 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:
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
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.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.
Escribe una función ChronoChain::sum que recorra recursivamente la ChronoChain y sume 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.