I'm confused on why we need to cast f2 to '&mut' when calling 'convert' function
and why not just '&' bec f2 is already defined as mutable.
fn convert(f: &mut String) -> bool {
true
}
fn main() {
let mut f2 = String::from("f1.txt");
convert(&mut f2); // why cast to mut here since f2 is already defined as mut ?
So when call convert(&mut f2) from the main the value of f2 is bound to parameter f of convert
and its binding has to match how binding is defined in the parameter of convert(&mut f2)?
This is the same thing as what you're doing. Now, let's annotate the types:
fn main() {
let mut f2: String = String::from("f1.txt");
let temp: &mut String = &mut f2;
convert(temp);
See how temp has the same time as the function requires? And how f2 is just a regular String?
Now, you may be asking "why do I need f2 to be mut?" The answer is basically "you can only take a &mut to something that's marked as mut, as a way to help you understand mutability in your program." It lets you know that f2 will be mutated somehow.
I think the misunderstanding i had was that i thought that & and mut are two separate thing in &mut, but it is one together a single operator, a mutable reference (&mut).
The mut on the left of : like in let mut f2: Stringis saying f2 is mutable.
But mut on the right of : can only come as &mut and it means that it is a mutable reference
to mutable variable.
is this understanding correct?
Also, thanks for taking time to help.
And also thanks to people fixing my english