Conversation

Replying to
the other data structures from the library that I'm using are vector and unordered_map, which I already liked perfectly well, they are both very nice abstractions 3/5
1
15
anyhow, once I understood that unique_ptr meant nothing like its name but rather something like auto_free_pointer, the pieces sort of fell into place and I experienced almost no memory safety bugs while implementing the compiler, nor has afl-fuzz found any so far 4/5
6
47
this is all despite my being a thoroughly mediocre C++ programmer. anyhow this story has no real point except that unique_ptr is actually pretty cool and useful, which I had not expected 5/5
11
97
Replying to and
The static enforcement of rules for move semantics and reference aliasing/lifetimes is the interesting part. Box<T> benefits from those in the same way as any other type. It's quite boring in the Rust world. Any type with a destructor has similar semantics.
1
2
A major difference from C++ in Rust is that assignment, passing and returning values works like C. If the type has a destructor, those have move semantics. A non-trivial copy is done by calling clone explicitly. Rust code uses far more moves and lot more lightweight references.
2
3
Replying to and
I don't think you'll really have as much to learn as you think. As a C++ programmer with a deep familiarity with how memory corruption happens and the semantics you need to avoid it, you largely have an informal and imperfect form of Rust's borrow checker in your head already.
2
4
The main you need to learn is not really syntax, semantics, etc. of the language and libraries. That all comes quite naturally... but rather, you need to learn the idioms needed to work around the static checking. You want to do something and it won't let you. Need to satisfy it.
2
3
If you pass an Rc<T> to a function, the variable can't be used again since passing/assignment/returning works like C. APIs usually take &T. If they actually need an owning reference you'd hand over the one you have and only pass it as ref.clone() if you still need it after.
1
1
The multi-threaded equivalent to Rc<RefCell<T>> is Arc<RwLock<T>> which essentially explains RefCell<T> to anyone who knows what a RwLock does. It's the single-threaded equivalent: dynamic enforcement of multiple readers or an exclusive writer instead of Rust's static checking.
1
2
Show replies