Asıl amacım, her satırda bir tane kelime listesi almak ve yorum satırlarını atmak ve G/Ç hatalarını düzgün bir şekilde yükseltmek için bir HashSet
içine koymaktır. dosyası "stopwords.txt" Verilen:Yineleyicimde dizeler neden birleştiriliyor?
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);
}
Burada da yukarıda dosya oluşturur bir playground var:
a
# this is actually a comment
of
the
this
Böyle derlemek kod yapmayı başardı.
Programın sonunda bir dizi 4 dizgiye sahip olmasını beklerim. Sürpriz olarak, işlev aslında birleştirilmiş tüm kelimeleri ile tek bir dize içeren bir dizi döndürür: FromIterator
için docs bir tavsiye liderliğindeki
{"aofthethis"}
thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `4`)'
, ben from_iter
için tüm çağrıların kurtulmak ve yerine collect
alıştım Gerçekten de sorunu çözmüş olan (Playground). collect()
eserler gibi amaçlanan ise
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()
}
Neden beklenmedik çıkarımları giden from_iter
önceki çağrılar vardır?
Lanet olsun, mayın yazarken yolun yaklaşık 2/3'ü var. –
@DK. belki daha iyi/farklı/anlaşılabilir bir açıklamanız var mı? – Shepmaster
Hayır, ters sırayla yazılmış, aşağı yukarı aynı şeydi. –