A friend asked me to explain the following quirk in Rust. I was unable to, hence this question:
fn main() { let l: Vec<String> = Vec::new(); //let ret = l.contains(&String::from(func())); // works let ret = l.contains(func()); // does not work println!("ret: {}", ret); } fn func() -> & 'static str { "hello" } Example on the Rust Playground
The compiler will complain like this:
error[E0308]: mismatched types --> src/main.rs:4:26 | 4 | let ret = l.contains(func()); // does not work | ^^^^^^ expected struct `std::string::String`, found str | = note: expected type `&std::string::String` found type `&'static str` In other words, &str does not coerce with &String.
At first I thought it was to do with 'static, however that is a red herring.
The commented line fixes the example at the cost of an extra allocation.
My questions:
- Why doesn't
&strcoerce with&String? - Is there a way to make the call to
containswork without the extra allocation?
Stringandstr. It's a question of coercion.strto coerce toString, and also how you could change your code to avoid allocation.