rust - 从行迭代器构建 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());
}
解决方案
该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
它会随着它产生拥有String
s 而不是借来的而变化&str
。
如果你想创建一个拥有其内容的 HashSet,你可以修改你的代码:
let test = "foo\nbar\n";
let hashset: HashSet<String> = test
.lines()
.map(String::from)
.collect();