Kurzusok
/
Cairo
Cairo
/
Feladatok
/
Chrono birodalmak: Chrono-lánc
Chrono birodalmak: Chrono-lánc

Chrono birodalmak: Chrono-lánc

Tanulófeladat

Bevezetés

A Cairo okos mutatói olyan fejlett adatszerkezetek, amelyek biztonsági funkciókkal egészítik ki a hagyományos mutatókat, így biztonságos és hatékony memóriakezelést tesznek lehetővé, és megelőzik az olyan gyakori problémákat, mint a nullmutatók dereferálása vagy a nem inicializált memória elérése.

Mi az az okos mutató?

Az okos mutató úgy viselkedik, mint egy hagyományos mutató, de nyomon követi a tulajdonjogot, és biztonságos memóriahozzáférést garantál, így megelőzi az olyan problémákat, mint a null- vagy a lógó mutatók dereferálása.

Az okos mutatók típusai

A Cairo több okos mutatótípust kínál, például Box<T> és Nullable<T>:

  • Box<T>: Egy speciális memóriaszegmensben tárolja az adatokat, ideális nagy vagy dinamikus méretű adatokhoz. Lehetővé teszi a tulajdonjog átadását anélkül, hogy az adatokat másolni kellene.
  • Nullable<T>: Vagy egy érvényes T típusú értékre, vagy null-ra mutat, így hasznos opcionális értékek kezeléséhez.

Memóriabiztonság

Az okos mutatók segítenek megelőzni a nem biztonságos memóriahozzáféréseket: gondoskodnak róla, hogy a memória automatikusan felszabaduljon, amikor már nincs rá szükség, így csökkentik a memóriaszivárgás kockázatát.

Példa: Box<T> használata rekurzív típusokhoz

Az olyan okos mutatók, mint a Box<T>, lehetővé teszik a rekurzív típusok biztonságos kezelését, például egy bináris fa esetében: hatékonyan foglalnak memóriát, és elkerülik a végtelen rekurziót.

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

Teljesítményelőnyök

Az okos mutatók azzal javítják a teljesítményt, hogy hivatkozásokat adnak tovább az adatokra a nagy struktúrák másolása helyett, ezzel csökkentve a memóriaterhelést.

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

Utasítások

A Chrono Realms világában az időőrök gyakran nemcsak idővonalak fáival találkoznak, hanem Chrono Chain-ekkel is: összekapcsolt TimeNode-ok sorozataival, amelyek mindegyike egy konkrét időpillanatot képvisel. A Chrono Chain egymás után következő pillanatok egyenes útvonala, ahol minden TimeNode a következőhöz kapcsolódik. Ezek a Chrono Chain-ek akkor hasznosak, amikor az időőrök egy meghatározott eseménysorozaton haladnak végig, mert így egyetlen idővonalat tudnak követni.

Ahhoz azonban, hogy ezekkel a potenciálisan hosszú Chrono Chain-ekkel elboldoguljanak, az időőrök okos mutatókat (Box<t>)</t> használnak: ezekkel kezelik és járják be biztonságosan a pillanatok listáit, anélkül hogy feleslegesen másolnák a memóriát, vagy túlcsordulás következne be. Minden TimeNode hivatkozást tárol a következő csomópontra, így rekurzív struktúra jön létre.

Tanoncként a te feladatod, hogy egy Chrono Chain-t rekurzív listastruktúraként, okos mutatók segítségével valósíts meg.

Ebben a feladatban a következőket fogod tenni:

  1. Létrehozol egy rekurzív ChronoChain enumbot, amely a pillanatok listáját képviseli.
  2. A Box<T> okos mutatóval tárolod a rekurzív csomópontokat.
  3. Írsz egy függvényt, amely u32 értékek tömbjéből létrehoz egy ChronoChain-t.
  4. Írsz egy függvényt, amely bejárja a ChronoChain-t, és összegzi a listában tárolt értékeket.

1. A rekurzív ChronoChain enum definiálása

Hozz létre egy rekurzív ChronoChain enumbot két változattal:

  • End: a lista végét jelöli.
  • Link: egy u32 értéket és a lánc következő csomópontjára mutató, Box-ba csomagolt hivatkozást tartalmaz.

2. Függvény a ChronoChain felépítéséhez

Írj egy ChronoChain::build függvényt, amely u32 értékek tömbjét kapja, és visszaad egy ChronoChain-t, az értékeket okos mutatók segítségével sorban összefűzve.

3. Az összegző függvény megvalósítása

Írj egy ChronoChain::sum függvényt, amely rekurzívan bejárja a ChronoChain-t, és összegzi az összes csomópont értékét.

Példa a használatra

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);
}
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Cairo Exercism

Készen állsz elkezdeni a(z) Chrono birodalmak: Chrono-lánc feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Cairo nyelvet 25 fogalom68 feladat segítségével, valódi emberi mentorálással, mindez ingyen.