【发布时间】:2017-06-25 10:19:45
【问题描述】:
我最初的目标是获取一个单词列表,每行一个,并将它们放入HashSet,同时丢弃注释行并正确引发 I/O 错误。给定文件“stopwords.txt”:
a
# this is actually a comment
of
the
this
我设法使代码像这样编译:
fn stopword_set() -> io::Result<HashSet<String>> {
let words = Result::from_iter(
BufReader::new(File::open("stopwords.txt")?)
.lines()
.filter(|r| match r {
&Ok(ref l) => !l.starts_with('#'),
_ => true
}));
Ok(HashSet::from_iter(words))
}
fn main() {
let set = stopword_set().unwrap();
println!("{:?}", set);
assert_eq!(set.len(), 4);
}
这是一个playground,它也创建了上面的文件。
我希望在程序结束时有一组 4 个字符串。令我惊讶的是,该函数实际上返回了一个集合,其中包含一个字符串,所有单词都连接在一起:
{"aofthethis"}
thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `4`)'
在FromIterator 文档中的一条建议的指导下,我摆脱了对from_iter 的所有调用并改用collect (Playground),这确实解决了问题。
fn stopword_set() -> io::Result<HashSet<String>> {
BufReader::new(File::open("stopwords.txt")?)
.lines()
.filter(|r| match r {
&Ok(ref l) => !l.starts_with('#'),
_ => true
}).collect()
}
为什么之前对 from_iter 的调用会导致意外的推断,而 collect() 的工作原理却是预期的?
【问题讨论】:
标签: iterator rust type-inference