I’m slowly starting Rust for Rustaceans, and it’s already poking holes in my understanding of Rust. Here’s a couple initial questions I have:
A shared reference, &T is , as the name implies, a pointer that may be shared. Any number of references may exist to the same value, and each shared reference is Copy, so you can trivially make more of them
I don’t understand why a shared reference has to implement copy. In fact, isn’t this not true just by the fact that references work for Strings and Strings size can’t be known at compile time?
- I’m having trouble with the idea of assigning a new value to a mutable reference.
let mut x = Box::new(42); *x = 84;
Why in this example, is the assignment dereferenced. Why not just do x=84? is it dereferenced specifically because is Boxed on the heap?
And the Copy question.It is not that s reference has to implement Copy. A reference IS Copy, by the simple fact that it is a primitive value on the stack.
This seems a bit misleading, noting that unique/mutable references aren’t
Copy
. Shared references areCopy
because it’s sound to have that, and it’s a huge QOL improvement over the alternative.In this context mutability is part of the type signatures. &T and &mut T are two different types, the former implements copy but not the later. It’s not really an “exception” in the type system.
I wouldn’t say it’s misleading. The question was specifically about shared references, it seemed obvious to me that’s what they were referring to in their answer.
Sure, but the way I read the answer was “All primitive values on the stack are Copy”, which isn’t true (my example being mutable references, which have the same representation as shared ones, “just” a different semantic meaning). That’s what I meant by misleading.
I think where I was getting hung up here as I was still thinking of the value of the reference rather than the reference itself. That’s why I brought up Strings, it didn’t make sense that String would automatically implement Copy since they go on the heap. But I see now we’re talking about the pointer reference TO that value.
Thanks!