- Ownership and Functions: Passing and returning ownership to manage resource lifecycles.
- Smart Pointers: Using types like
Box
, Rc
, and RefCell
to manage ownership and borrowing with more flexibility. - Interior Mutability: Allowing mutation through immutable references using patterns like
RefCell
.
use std::cell::RefCell;
use std::rc::Rc;
#[derive(Debug)]
struct Node {
value: i32,
next: Option<Rc<RefCell<Node>>>,
}
fn main() {
let first = Rc::new(RefCell::new(Node { value: 1, next: None }));
let second = Rc::new(RefCell::new(Node { value: 2, next: None }));
first.borrow_mut().next = Some(Rc::clone(&second));
second.borrow_mut().next = Some(Rc::clone(&first)); // Creates a cycle, but managed by Rc and RefCell
println!("First node: {:?}", first);
}