Smart Pointer in Cairo sind fortgeschrittene Datenstrukturen, die eine sichere und effiziente Speicherverwaltung gewährleisten. Sie fügen regulären Pointern Sicherheitsfunktionen hinzu und verhindern so häufige Probleme wie das Dereferenzieren von Null-Pointern oder den Zugriff auf nicht initialisierten Speicher.
Ein Smart Pointer verhält sich wie ein regulärer Pointer, verfolgt aber die Eigentümerschaft und gewährleistet einen sicheren Speicherzugriff. So vermeidest du Probleme wie das Dereferenzieren von Null- oder verwaisten Pointern.
Cairo bietet mehrere Arten von Smart Pointern, zum Beispiel Box<T> und Nullable<T>:
Box<T>: Speichert Daten in einem speziellen Speichersegment, ideal für große oder dynamisch große Daten. Sie ermöglicht die Übertragung der Eigentümerschaft, ohne die Daten zu kopieren.Nullable<T>: Verweist entweder auf einen gültigen Wert vom Typ T oder auf null und ist damit nützlich für den Umgang mit optionalen Werten.Smart Pointer helfen, unsichere Speicherzugriffe zu verhindern, und sorgen dafür, dass Speicher automatisch freigegeben wird, wenn er nicht mehr benötigt wird. So sinkt das Risiko von Speicherlecks.
Box<T> für rekursive Typen verwendenSmart Pointer wie Box<T> ermöglichen den sicheren Umgang mit rekursiven Typen, etwa in einem Binärbaum, indem sie Speicher effizient zuweisen und eine Endlosrekursion vermeiden.
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);
}
Smart Pointer verbessern die Leistung, indem sie Referenzen auf Daten übergeben, statt große Strukturen zu kopieren, und reduzieren so den Overhead im Speicher.
// `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);
}
In Chrono Realms haben es Zeitwächter oft nicht nur mit Bäumen von Zeitlinien zu tun, sondern mit Chrono Chains, also Sequenzen von verbundenen TimeNodes, von denen jeder einen bestimmten Moment in der Zeit darstellt. Eine Chrono Chain ist ein gerader Pfad aufeinanderfolgender Momente, bei dem jeder TimeNode mit dem nächsten verbunden ist. Diese Chrono Chains sind nützlich, wenn du durch eine Reihe bestimmter Ereignisse reist, denn sie ermöglichen es Zeitwächtern, einer einzelnen Zeitlinie zu folgen.
Um jedoch mit diesen potenziell langen Chrono Chains umzugehen, verwenden Zeitwächter Smart Pointers (Box<t>)</t>, um diese Listen von Momenten sicher zu verwalten und zu durchlaufen, ohne unnötige Speicherduplizierung oder einen Überlauf zu verursachen. Jeder TimeNode hält eine Referenz auf den nächsten Knoten und bildet so eine rekursive Struktur.
Deine Aufgabe als Auszubildender ist es, eine Chrono Chain als rekursive Listenstruktur mit Smart Pointern zu implementieren.
In dieser Übung wirst du:
ChronoChain-Enum erstellen, das eine Liste von Momenten darstellt.Box<T> verwenden, um die rekursiven Knoten zu speichern.u32-Werten eine ChronoChain erstellt.ChronoChain durchläuft und die in der Liste gespeicherten Werte aufsummiert.ChronoChain
Erstelle ein rekursives Enum ChronoChain mit zwei Varianten:
End: Steht für das Ende der Liste.Link: Enthält einen u32-Wert und eine per Box verpackte Referenz auf den nächsten Knoten in der Kette.Schreibe eine Funktion ChronoChain::build, die ein Array von u32-Werten entgegennimmt und eine ChronoChain zurückgibt, wobei die Werte mithilfe von Smart Pointern sequenziell verkettet werden.
Schreibe eine Funktion ChronoChain::sum, die die ChronoChain rekursiv durchläuft und die Werte aller Knoten aufsummiert.
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);
}
Melde dich bei Exercism an, um Cairo mit 25 Konzepte68 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.