【问题标题】:How do I initialise a HashMap with specific key and value types? [duplicate]如何初始化具有特定键和值类型的 HashMap? [复制]
【发布时间】:2020-11-25 16:56:02
【问题描述】:

我阅读了HashMap 上的文档,我知道他们可以拥有alternate custom types。这个例子在文档中给出:

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

我宁愿不定义显式类型。我有一个函数需要一个可变的HashMap&lt;PathBuf, bool&gt;

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();

有什么办法吗?

【问题讨论】:

  • compiler tells you the correct syntax: help: use `::&lt;...&gt;` instead of `&lt;...&gt;` to specify type arguments
  • 我平时都是跟着编译器走的,但这次错过了这个提示。
  • 嘿@Shepmaster 我了解 StackOverflow 无情地修剪冗余问题的做法,但我不认为我发布了 What is the proper way to create a new generic struct? 的副本。我的问题更具体,它是关于在初始化 HashMap 时如何定义类型,而另一个是关于结构类型。您会考虑删除“重复”标签吗?
  • A HashMap 是一个结构,所以我看不出有什么区别。对于“如何初始化 VecBTreeMap 或 ...”,我也会这样做。请记住,重复的还不错,它们没有被“修剪”。这将永远存在,答案也将永远存在。此外,正如重复的横幅所说:“这个问题已经在这里有答案”,而不是“这是同一个问题”。这是关于重复的答案,而不是问题。
  • 哦,好的,谢谢您的解释。我不确定重复项会在网站上停留多长时间。

标签: rust hashmap


【解决方案1】:

表达式(而不是类型)中泛型的参数需要一个额外的::。正确的语法是:

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

这种结构有时被称为“涡轮鱼”。我找不到关于它的规范参考(这个词出现在书中only once),但this article 非常好。

【讨论】:

    【解决方案2】:

    注释示例:

    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

    【讨论】:

      【解决方案3】:

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

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

      或者添加类型注解:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2020-06-28
        • 2011-09-25
        • 1970-01-01
        • 2021-02-03
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多