I'm having trouble figuring out what's happening when I forward a reference argument to another function in Rust that also expects a reference argument.
Basically, I'm confused about when a value is a reference (that needs to be de-referenced with *
) and when it's just a value that can be used directly. For example,
fn second(s: &String) {
println!("Got string '{}'", *s); // Can also use s
}
fn first(s: &String) {
second(s); // Can also use &s
}
fn main() {
let s = String::from("Hello, World!");
first(&s);
}
As shown above, any of the four total combinations of passing s
from first
into second
and printing s
inside second
works. My intuition says that s
inside first
is a reference and thus &s
would be a double reference, and that s
inside second
is a reference that needs to be de-referenced, but it doesn't seem to actually matter. What's going on here?