mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2025-04-30 02:08:02 +08:00
45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
use crate::List::{Cons, Nil};
|
|
use std::cell::RefCell;
|
|
use std::rc::Rc;
|
|
|
|
#[derive(Debug)]
|
|
enum List {
|
|
Cons(i32, RefCell<Rc<List>>),
|
|
Nil,
|
|
}
|
|
|
|
impl List {
|
|
fn tail(&self) -> Option<&RefCell<Rc<List>>> {
|
|
match self {
|
|
Cons(_, item) => Some(item),
|
|
Nil => None,
|
|
}
|
|
}
|
|
}
|
|
|
|
// ANCHOR: here
|
|
fn main() {
|
|
let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));
|
|
|
|
println!("a initial rc count = {}", Rc::strong_count(&a));
|
|
println!("a next item = {:?}", a.tail());
|
|
|
|
let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));
|
|
|
|
println!("a rc count after b creation = {}", Rc::strong_count(&a));
|
|
println!("b initial rc count = {}", Rc::strong_count(&b));
|
|
println!("b next item = {:?}", b.tail());
|
|
|
|
if let Some(link) = a.tail() {
|
|
*link.borrow_mut() = Rc::clone(&b);
|
|
}
|
|
|
|
println!("b rc count after changing a = {}", Rc::strong_count(&b));
|
|
println!("a rc count after changing a = {}", Rc::strong_count(&a));
|
|
|
|
// Uncomment the next line to see that we have a cycle;
|
|
// it will overflow the stack
|
|
// println!("a next item = {:?}", a.tail());
|
|
}
|
|
// ANCHOR_END: here
|