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.
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.
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.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.
Box<T> használata rekurzív típusokhozAz 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);
}
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);
}
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:
ChronoChain enumbot, amely a pillanatok listáját képviseli.Box<T> okos mutatóval tárolod a rekurzív csomópontokat.u32 értékek tömbjéből létrehoz egy ChronoChain-t.ChronoChain-t, és összegzi a listában tárolt értékeket.ChronoChain enum definiálásaHozz 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.Í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.
Írj egy ChronoChain::sum függvényt, amely rekurzívan bejárja a ChronoChain-t, és összegzi az összes csomópont értékét.
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);
}
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.