轨道
/
Cairo
Cairo
/
练习
/
时空领域:时空之链
时空领域:时空之链

时空领域:时空之链

学习练习

简介

Cairo 中的智能指针是一种高级数据结构,它通过为普通指针增加安全特性来确保内存管理既安全又高效,可以避免解引用空指针、访问未初始化内存等常见问题。

什么是智能指针?

智能指针的行为和普通指针一样,但它会跟踪所有权并确保内存访问安全,从而避免解引用空指针或悬空指针之类的问题。

智能指针的类型

Cairo 提供了多种智能指针类型,例如Box<T>和Nullable<T>:

  • Box<T>:把数据存储在一个特殊的内存段中,非常适合大型数据或大小在运行时才能确定的数据。 它允许在不复制数据的情况下转移所有权。
  • Nullable<T>:指向类型T的有效值或null,适合处理可选值。

内存安全

智能指针有助于防止不安全的的内存访问,确保不再需要的内存会被自动释放,从而降低内存泄漏的风险。

示例:用Box<T>处理递归类型

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

性能优势

智能指针通过传递数据的引用,而不是复制大型结构体来提升性能,减少了内存开销。

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

说明

在Chrono Realms中,Time Keepers 要处理的往往不只是由时间线构成的树,还有Chrono Chains,也就是由一个个TimeNode链接而成的序列,每个节点都代表时间中的某个特定时刻。 Chrono Chain是一条由先后相继的时刻组成的直线路径,其中每个TimeNode都连接到下一个节点。 在穿梭于一系列特定事件时,Chrono Chains很有用,因为它们让 Time Keepers 能够沿着单条时间线前进。

不过,要处理这些可能很长的Chrono Chains,Time Keepers 会使用智能指针(Box<t>)<strong>来安全地管理和遍历这些时刻列表,而不会造成不必要的内存复制或溢出。 每个</strong>TimeNode</t>都持有对下一个节点的引用,从而构成递归结构。

作为学徒,你的任务是用智能指针把Chrono Chain实现为一种递归的列表结构。

在这个练习中,你将:

  1. 创建一个递归的ChronoChain枚举,用来表示一串时刻。
  2. 使用Box<T>智能指针来存储递归的节点。
  3. 实现一个函数,从由u32值组成的数组创建ChronoChain。
  4. 实现一个函数,遍历ChronoChain并把列表中存储的值相加。

1. 定义递归的ChronoChain枚举

创建一个包含两个变体的递归枚举ChronoChain:

  • End:表示列表的结尾。
  • Link:包含一个u32值,以及一个指向链中下一个节点的装箱引用。

2. 编写一个函数来构建 ChronoChain

编写一个函数ChronoChain::build,接收一个由u32值组成的数组,返回一个ChronoChain,并使用智能指针把这些值按顺序链接起来。

3. 实现求和函数

编写一个函数ChronoChain::sum,递归地遍历ChronoChain,并把所有节点的值相加。

示例用法

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);
}
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Cairo Exercism

准备好开始 时空领域:时空之链 了吗?

注册 Exercism,借助 25 个概念68 个练习 和真人导师指导,学习并掌握 Cairo,全部免费。