如何使用特定的键和值类型初始化 HashMap?

How do I initialise a HashMap with specific key and value types?

我阅读了 HashMap and I understand that they can have alternate custom types 上的文档。这个例子在文档中给出:

type Accounts<'a> = HashMap<Account<'a>, AccountInfo<'a>>;
let mut accounts: Accounts = HashMap::new();

我宁愿不定义显式类型。我有一个需要可变 HashMap<PathBuf, bool>:

的函数
pub fn parse(
    visited: &mut HashMap<PathBuf, bool>,
    path: PathBuf,
) -> Result<(), Box<dyn std::error::Error>> {
    unimplemented!()
}

在我的“main”函数中,我这样调用“parse”:

let mut visited = HashMap::new();
parse(&mut visited, args.path)?;

代码可以编译,但我想在创建 visited 变量时更明确地定义类型。看起来下面的语法不正确:

let mut visited = HashMap<PathBuf, bool>::new();

有什么办法吗?

表达式(相对于类型)中泛型的参数需要额外的 ::。正确的语法是:

let mut visited = HashMap::<PathBuf, bool>::new();

这种构造有时被称为“turbofish”。我找不到关于它的规范参考(这个词出现 only once in the Book), but this article 非常好。

评论示例:

use std::collections::HashMap;
use std::path::PathBuf;

fn parse(visited: &mut HashMap<PathBuf, bool>) {}

fn main() {
    // explicit type annotation
    let mut visited: HashMap<PathBuf, bool> = HashMap::new();
    
    // turbo-fish
    let mut visited = HashMap::<PathBuf, bool>::new();
    
    // the compiler can infer type from use
    let mut visited = HashMap::new();
    parse(&mut visited); // compiler can tell visited must be HashMap<PathBuf, bool>
}

playground link

您可以使用 turbofish 语法绑定到通用参数:

let mut visited = HashMap::<PathBuf, bool>::new();

或添加类型注解:

let mut visited: HashMap<PathBuf, bool> = HashMap::new();