Rust程序设计第二版-把书读薄之难点使用(六)

11 次浏览
2024年07月29日创建

Rust的问题还是很多,主要是一些关键的使用方法太多了,需要知道什么时候用,为什么用是非常关键的,下面罗列的是基本上贯穿《Rust程序设计 - 第二版》的所有难点理解内容。为了将这些内容融会贯通,需要非常多的例子总结才能理解。下面内容就开始对其中的内容一个一个来梳理。

主要概念

Rc、Arc、ref、mut、、'a、'static、Default、asRef、Self、self、Send、Sync、Cow<T>、 Mutex<T> 和 RwLock<T> 、unwrap、into_inner、clone_from、as_mut_ptr、fmt、trait、Fn、FnOnce、FnMut.

Rc、Arc

Rc<T> 和 Arc<T> 是两种用于引用计数的智能指针,分别适用于单线程和多线程环境。它们的使用场景取决于是否需要在多个所有者之间共享数据,以及是否需要在线程之间共享数据。

Rc<T>

  • 适用于单线程环境。
  • 用于共享不可变数据的所有权。
  • 不能在线程之间共享。

Arc<T>

  • 适用于多线程环境。
  • 用于在线程之间共享数据的所有权。
  • 使用原子操作来维护引用计数,确保线程安全。
use std::rc::Rc;

struct Node {
    value: i32,
    next: Option<Rc<Node>>,
}

fn main() {
    // 创建一个 Rc<Node>,表示一个节点
    let node1 = Rc::new(Node {
        value: 1,
        next: None,
    });

    // 创建另一个 Rc<Node>,它的 next 指向第一个节点
    let node2 = Rc::new(Node {
        value: 2,
        next: Some(Rc::clone(&node1)),
    });

    // 创建第三个 Rc<Node>,它的 next 指向第二个节点
    let node3 = Rc::new(Node {
        value: 3,
        next: Some(Rc::clone(&node2)),
    });

    // 打印链表节点的值
    print_list(&node3);

    // Rc 允许多个所有者共享同一个数据
    let node4 = Rc::clone(&node2);
    println!("node4 value: {}", node4.value);

    // 打印引用计数
    println!("node1 strong count: {}", Rc::strong_count(&node1));
    println!("node2 strong count: {}", Rc::strong_count(&node2));
    println!("node3 strong count: {}", Rc::strong_count(&node3));
}

fn print_list(node: &Rc<Node>) {
    let mut current = Some(Rc::clone(&node));
    while let Some(n) = current {
        println!("Node value: {}", n.value);
        current = n.next.as_ref().map(|next| Rc::clone(next));
    }
}

ref