A tree of Rc/Arc<T> is a tree of references, and is really no different than a Java or Python reference value, except that you'll have to do explicit .clone()s
Is it mutability that's tripping you up? Because that's the only gotcha I can think of. Yes, you won't get mutability of the content of those references unless you stick a RefCell or a Mutex inside them.
You can get something like what you're used to a "traditional" language without compiler safeguards by using RefCell and .borrow_mut() on it. That will let you get past the compile-time borrow checks but will do runtime borrow checking and throw panic if more than one borrow happens at runtime.
It's verbose, but it's explicit, at least.
So:
struct Node {
parent: Rc<RefCell<Node>>,
left: Option<Rc<RefCell<Node>>>,
right Option<Rc<RefCell<Node>>>,
}
and just off the top of my head it'd be something like
{
let my_parent = my_node.parent.borrow_mut();
... do stuff with my_parent ...
}
... my_parent drops out of scope here, now others can borrow ...
etc.
Haven't tried this in compiler my memory might not be right here.
I don't have a twitter account and don't read links to paywalled services there, so don't know what the complaint is.
Ergonomics aren't great for this type of problem, but it's something I almost never run into. Feels like a cooked up example. I've written tree data structures, etc. and never had much issue. ASTs for compilers, no particular drama.
Rust is just making you consider whether you really want to do this, is all.
Is it mutability that's tripping you up? Because that's the only gotcha I can think of. Yes, you won't get mutability of the content of those references unless you stick a RefCell or a Mutex inside them.