Conversation

Replying to and
what I mean is, I have no idea how I could create a working compiler without letting people borrow addresses/references all over the place. however, I made sure that all borrowers either made a copy or else forgot about what they had borrowed.
2
4
Replying to and
Assignment, passing and returning in Rust works like C rather than C++. It has move semantics by default. If you try to use it after it was moved, you get an error and realize you need to either add a call to clone() or use a reference, and it prevent using dangling references.
1
2
In Rust, you end up using drastically more moves than in C++ along with substantially more lightweight references. So, for example, using Rc<T> (thread-local shared pointer) or Arc<T> (cross-thread) in Rust is way cheaper because you use drastically more moves / references.
1
1
Moving is an implicit default in Rust. The important part is it's all memory safe due to the compiler preventing using anything after the lifetime ends. It tracks the lifetime of references as part of their type to prevent using them beyond the scope of what they reference.
1
If you take deeper mut references, can't use the outer ones until those are gone. The language and libraries are designed around having lifetime checks and aliasing checks. Lifetime and aliasing rules also end up being the basis for not having data races, alongside Send / Sync.
1
Most types are both Send and Sync. These things are integrated into the language. The most complex piece of it is the borrow checking system enforcing the lifetime and aliasing rules. It's easy to understand the concepts it implements but it's far from trivial to implement it.