首页 > 解决方案 > 从行迭代器构建 Hashset

问题描述

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

use std::collections::HashSet;

let test = "foo\nbar\n";

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

我收到此错误:

类型的值Result<HashSet<_>, _>不能从类型元素的迭代器中构建&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

解决方案


lines()方法不会失败,因为它在 a 上运行&str,因此您应该收集到 a HashSet<&str>。请参阅https://doc.rust-lang.org/std/primitive.str.html#method.lines

例如:

let test = "foo\nbar\n";

let hashset: HashSet<&str> = test
    .lines()
    .collect();

在操场上看到它的实际效果。

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

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

除了这个差异之外,BufRead.lines它会随着它产生拥有Strings 而不是借来的而变化&str

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

let test = "foo\nbar\n";

let hashset: HashSet<String> = test
    .lines()
    .map(String::from)
    .collect();

推荐阅读