I\'m trying to build a self-referential HashMap
:
use std::collections::HashMap;
struct Node<\'a> {
byte: u8,
map: HashMap
These types of structures can be hard to make in Rust. The main thing missing from your sample is the use of RefCell which allows for shared references. RefCell
s move Rust's borrow checking from compile-time to run-time, and thus allows you to pass around the memory location. However, don't start using RefCell
everywhere, as it is only suitable for situations like this, and RefCell
s will cause your program to panic!
if you attempt to mutably borrow something while it is already mutably borrowed. This will only work with Node
s created in network
; you won't be able to create Node
s that exist purely inside of a single Node
.
use std::collections::HashMap;
use std::cell::RefCell;
#[derive(Debug)]
struct Node<'a> {
byte: u8,
map: HashMap<i32, &'a RefCell<Node<'a>>>,
}
fn main() {
let mut network = HashMap::new();
network.insert(0, RefCell::new(Node { byte: 0, map: HashMap::new() }));
network.insert(1, RefCell::new(Node { byte: 1, map: HashMap::new() }));
let zero_node = network.get(&0).unwrap();
zero_node.borrow_mut().byte = 2;
let first_node = network.get(&1).unwrap();
first_node.borrow_mut().map.insert(-1, zero_node);
println!("{:#?}", network);
}