【问题标题】:Build a Hashset from a lines iterator从行迭代器构建 Hashset
【发布时间】:2021-08-22 05:36:03
【问题描述】:

我不明白为什么这不起作用:

use std::collections::HashSet;

let test = "foo\nbar\n";

let hashset: HashSet<_> = test
    .lines()
    .collect::<Result<HashSet<_>, _>>()
    .unwrap()

我收到此错误:

Result&lt;HashSet&lt;_&gt;, _&gt; 类型的值不能从 &amp;str 类型元素的迭代器中构建

我尝试使用中介Vec,但我也没有成功。我理解这个错误,但我不知道如何优雅地解决这个问题

这可行,但不是最快的解决方案:

use std::collections::HashSet;

let test = "foo\nbar\n";
let hashset = HashSet::new();

for word in test.lines() {
  hashset.insert(p.to_string());
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    lines() 方法不会失败,因为它在&amp;str 上运行,因此您应该收集到HashSet&lt;&amp;str&gt;。 见https://doc.rust-lang.org/std/primitive.str.html#method.lines

    例如:

    let test = "foo\nbar\n";
    
    let hashset: HashSet<&str> = test
        .lines()
        .collect();
    

    playground 中查看它的实际效果。

    您在这里的困惑似乎来自这样一个事实,即在 BufRead 上运行的类似 lines 方法可能由于对文件或其他基于 I/O 的源的操作而失败。

    https://doc.rust-lang.org/std/io/trait.BufRead.html#method.lines

    除了这种差异之外,BufRead.lines 也有所不同,因为它产生拥有 Strings 而不是借来的 &amp;str

    如果你想创建一个拥有其内容的 HashSet,你可以这样修改你的代码:

    let test = "foo\nbar\n";
    
    let hashset: HashSet<String> = test
        .lines()
        .map(String::from)
        .collect();
    

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多