Mục tiêu ban đầu của tôi là tìm nạp danh sách các từ, mỗi từ trên mỗi dòng và đặt chúng trong một HashSet
, trong khi loại bỏ các dòng nhận xét và tăng lỗi I/O đúng cách. Căn cứ vào tập tin "stopwords.txt":Tại sao các chuỗi trong trình lặp của tôi lại được nối?
a
# this is actually a comment
of
the
this
tôi quản lý để thực hiện các mã biên dịch như thế này:
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);
}
Dưới đây là một playground đó cũng tạo ra các tập tin trên.
Tôi mong đợi có một bộ 4 chuỗi ở cuối chương trình. Trước sự ngạc nhiên của tôi, thực tế hàm trả về một tập chứa một chuỗi duy nhất với tất cả các từ nối:
{"aofthethis"}
thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `4`)'
Được dẫn dắt bởi một lời khuyên trong các tài liệu cho FromIterator
, tôi đã thoát khỏi tất cả các cuộc gọi đến from_iter
và sử dụng collect
thay (Playground), đã thực sự giải quyết được vấn đề.
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()
}
Tại sao các cuộc gọi trước để from_iter
dẫn đến kết luận bất ngờ, trong khi collect()
công trình cũng giống như dự định?
Chết tiệt, có khoảng 2/3 của con đường thông qua viết của tôi lên. –
@DK. có lẽ bạn đã có một lời giải thích tốt hơn/khác nhau/dễ hiểu hơn? – Shepmaster
Không, nó đã được nhiều hơn hoặc ít hơn cùng một điều, được viết theo thứ tự ngược lại. –