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