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<i32> for i32). That means that you have to add an appropriate level of dereferencing in order to get both sides to an integer.