I\'m new to Rust and I don\'t understand the following piece of code:
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!(\"{}\", x);
If
*yis a reference
*y is not a reference. y is a reference; *y dereferences y, allowing you access to the referred-to value.
what is the difference [between
+=andprintln!]
println! is a macro that automatically references the arguments given to it. In addition, the Display trait (used via {} in the format string) is implemented for all references to types that themselves implement Display (impl<'a, T> Display for &'a T where T: Display + ?Sized).
Thus, println!("{}", y); is actually printing out a reference to a reference to a value. Those intermediate references are automatically dereferenced due to the implementation of Display.
+=, on the other hand, is implemented via the AddAssign trait. The standard library only implements adding an integer type to itself (impl AddAssign). That means that you have to add an appropriate level of dereferencing in order to get both sides to an integer.