Tracks
/
Cairo
Cairo
/
Übungen
/
Chrono-Reiche Chrono-Kette
Chrono-Reiche Chrono-Kette

Chrono-Reiche Chrono-Kette

Lernübung

Einführung

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.

Was ist ein Smart Pointer?

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.

Arten von Smart 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.

Speichersicherheit

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.

Beispiel: Box<T> für rekursive Typen verwenden

Smart 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);
}

Leistungsvorteile

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);
}

Anleitung

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:

  1. Ein rekursives ChronoChain-Enum erstellen, das eine Liste von Momenten darstellt.
  2. Den Smart Pointer Box<T> verwenden, um die rekursiven Knoten zu speichern.
  3. Eine Funktion implementieren, die aus einem Array von u32-Werten eine ChronoChain erstellt.
  4. Eine Funktion implementieren, die die ChronoChain durchläuft und die in der Liste gespeicherten Werte aufsummiert.

1. Definiere das rekursive Enum 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.

2. Schreibe eine Funktion, die eine ChronoChain aufbaut

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.

3. Implementiere die Summenfunktion

Schreibe eine Funktion ChronoChain::sum, die die ChronoChain rekursiv durchläuft und die Werte aller Knoten aufsummiert.

Beispielverwendung

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);
}
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Cairo Exercism

Bereit, mit Chrono-Reiche Chrono-Kette zu starten?

Melde dich bei Exercism an, um Cairo mit 25 Konzepte68 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.