I'm new to Rust (1.31) and I would like to understand a simple piece of code that does not compile:
fn main() {
    s = String::from("foo");
    match s {
        "foo" => {
            println!("Yes");
        }
        _ => {
            println!("No");
        }
    }
}
The error associated is :
10 |         "foo" => {                                                                                 
   |         ^^^^^ expected struct `std::string::String`, found reference
After this error, I decided to change the code to :
fn main() {
    let s = String::from("foo");
    match s {
        String::from("foo") => {
            println!("Yes");
        }
        _ => {
            println!("No");
        }
    }
}
By doing so, I was hoping to have the correct type, but it is not the case :
10 |         String::from("foo") => {                                                                   
   |         ^^^^^^^^^^^^^^^^^^^ not a tuple variant or struct
I am quite puzzled with this message from the compiler, at the end I managed to make it work by implementing :
fn main() {
    let s = String::from("foo");
    match &s as &str {
        "foo" => {
            println!("Yes");
        }
        _ => {
            println!("No");
        }
    }
}
However, I do not understand the underlying mechanisms that make this solution the right one and why my second example does not work.
 
    