面试题答案
一键面试设计思路
Rc
(引用计数):用于表示共享所有权。当一个值有多个所有者时,可以使用Rc
来管理其生命周期。每个Rc
实例都会增加引用计数,当引用计数降为0时,值被释放。Weak
(弱引用):用于打破循环引用。Weak
不增加引用计数,所以不会阻止值的释放。它可以用来创建一个指向Rc
所管理值的弱引用,通过upgrade
方法可以尝试将Weak
提升为Rc
,如果值还存在,则提升成功,否则返回None
。
示例代码
use std::rc::Rc, Weak;
// 定义一个简单的结构体
struct Node {
value: i32,
next: Option<Weak<Node>>,
}
impl Node {
fn new(value: i32) -> Rc<Node> {
Rc::new(Node {
value,
next: None,
})
}
}
fn main() {
// 创建两个节点
let node1 = Node::new(1);
let node2 = Node::new(2);
// 使用Weak来打破循环引用
let weak_ref = Rc::downgrade(&node2);
node1.next = Some(weak_ref);
let upgraded = node1.next.as_ref().and_then(|weak| weak.upgrade());
if let Some(ref upgraded_node) = upgraded {
println!("Upgraded node value: {}", upgraded_node.value);
}
}
在上述代码中,Node
结构体包含一个 value
和一个指向另一个 Node
的 Weak
引用。Node::new
方法用于创建新的 Node
实例。在 main
函数中,创建了两个 Node
,并使用 Rc::downgrade
将 node2
的 Rc
转换为 Weak
引用,然后赋值给 node1
的 next
字段。这样就避免了循环引用。通过 and_then
和 upgrade
方法可以尝试获取被弱引用的值。