I've got the following code:
use std::collections::HashMap;
fn main() {
    let xs: Vec<&str> = vec!("a", "b", "c", "d");
    let ys: Vec<i32> = vec!(1, 2, 3, 4);
    let mut map: HashMap<String,i32> = HashMap::new();
    for (x,y) in xs.iter().zip(ys) {
        map.insert(x.to_owned(), y);
    }
    println!("{:?}", map);
}
Which results in error:
<anon>:8:20: 8:32 error: mismatched types:
 expected `collections::string::String`,
    found `&str`
(expected struct `collections::string::String`,
    found &-ptr) [E0308]
<anon>:8         map.insert(x.to_owned(), y);
But it doesn't make sense to me. x should be &&str at this point. So why doesn't &&str.to_owned() automagically Deref the same way x.to_string() does at this point? (Why is x.to_owned() a &str?)
I know I can fix this by either using x.to_string(), or xs.into_iter() instead.
 
     
    