从行迭代器构建哈希集

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

use std::collections::HashSet;

let test = "foonbarn";

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

我收到此错误:

类型的值Result<HashSet<_>, _>不能从一个迭代过类型的元素来构建&str

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

这有效,但不是最快的解决方案:

use std::collections::HashSet;

let test = "foonbarn";
let hashset = HashSet::new();

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

回答

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

例如:

let test = "foonbarn";

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

看看它在操场上的行动。

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

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

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

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

let test = "foonbarn";

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


以上是从行迭代器构建哈希集的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>