从行迭代器构建哈希集
我不明白为什么这不起作用:
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();