私の本来の目標は、コメント行を破棄してI/Oエラーを適切に発生させながら、各行に1つの単語のリストを取り出してHashSet
に入れることです。私は、コードを作るために管理イテレータの文字列が連結されているのはなぜですか?
a
# this is actually a comment
of
the
this
は次のようにコンパイルします:ファイル「stopwords.txt」を考える
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つの文字列のセットがあると思います。驚いたことに、関数が実際に連結すべての単語を備えた単一の文字列が含まれるセットを返します:FromIterator
ためのドキュメントでアドバイス断片が率いる
{"aofthethis"}
thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `4`)'
を、私はfrom_iter
にすべてのコールを取り除き、代わりにcollect
を使用しました(Playground)、実際問題を解決しました。 collect()
が意図したのと同様に動作しながら
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
への以前の呼び出しですか?
くそー、書き込むことで2/3の方法を手に入れました。 –
@DK。多分あなたはより良い/異なった/より理解できる説明を持っていますか? – Shepmaster
ナー、それは多かれ少なかれ逆の順序で書かれていました。 –