包龙星

把这个重要的证据(数据)放到盒子里 (Box),扔到堆上,别让它占了栈的地方。

方唐镜

大人,如果这个证据同时属于我和戚秦氏呢?(多重所有权)

豹子头 (雷豹)

那就用 Rc (Reference Counting)!记个数,谁最后用完谁负责扔!

Rust 智能指针:超能容器

智能指针是行为像指针的数据结构,但拥有额外的元数据和功能。

📦 Box<T>

最简单的智能指针,允许你在堆上存储数据。用于在编译时不知道大小的类型。

fn main() {
    let b = Box::new(5);
    println!("b = {}", b);
}

🤝 Rc<T> (引用计数)

Rc (Reference Counting) 允许一个值有多个所有者。当引用计数为 0 时才清理。

use std::rc::Rc;

fn main() {
    let a = Rc::new(String::from("尚方宝剑"));
    let b = Rc::clone(&a); // 计数 +1
    let c = Rc::clone(&a); // 计数 +1
    
    println!("引用计数: {}", Rc::strong_count(&a)); // 3
}

👓 RefCell<T> (内部可变性)

允许你在不可变引用中修改数据(绕过编译时借用检查,改为运行时检查)。

use std::cell::RefCell;

fn main() {
    let x = RefCell::new(5);
    
    // 即使 x 是不可变的,我们也可以修改里面的值
    *x.borrow_mut() += 1;
    
    println!("x = {:?}", x);
}
🧠

动手时刻:链表

使用 Box 创建一个简单的递归类型(链表)。

  1. 定义枚举 List,包含 Cons(i32, Box<List>)Nil
  2. 在 main 中创建一个列表:1 -> 2 -> 3 -> Nil。
  3. 注意:如果不适用 Box,Rust 无法确定 List 的大小,会报错。
查看参考答案 (点击揭榜)

enum List {
    Cons(i32, Box<List>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}
                    

成就解锁:【套娃大师】 🪆