HashMap type inference

In the code below, why does type inference need help in the case of from_iter and collect, but not for new?

use std::collections::HashMap;

fn main() {

    let data = [(1,1),

    let mut new = HashMap::new();
    for (k,v) in data {

    let from_iter = HashMap::from_iter(data);

    let collect = data
        .collect::<HashMap<_, _, _>>();


This is an example of what's described in Defaults Affect Inference. The new function is only implemented for S = RandomState, but its FromIterator is implemented for any S hasher.

1 Like

As for collect(), it's generic in the return type, so that it can collect into any collection. It doesn't only produce a HashMap; you could make a Vec or VecDeque or BTreeMap etc. using collect(). It's just a syntactically more convenient equivalent to FromIterator::from_iter().