Tôi đang cố gắng lặp qua các ký tự trong stdin. Phương pháp Read.chars()
đạt được mục tiêu này, nhưng không ổn định. Cách thay thế rõ ràng là sử dụng Read.lines()
với số flat_map
để chuyển đổi nó thành trình lặp ký tự.Tại sao .flat_map() với .chars() không hoạt động với std :: io :: Lines, nhưng với vector của Strings?
Điều này có vẻ như nó sẽ hoạt động, nhưng không, dẫn đến lỗi borrowed value does not live long enough
.
use std::io::BufRead;
fn main() {
let stdin = std::io::stdin();
let mut lines = stdin.lock().lines();
let mut chars = lines.flat_map(|x| x.unwrap().chars());
}
Điều này được đề cập trong Read file character-by-character in Rust, nhưng thực sự không giải thích được lý do.
Điều tôi đặc biệt nhầm lẫn là cách điều này khác với ví dụ trong documentation for flat_map
, sử dụng flat_map
để áp dụng .chars()
cho vectơ của chuỗi. Tôi không thực sự thấy nó khác nhau như thế nào. Sự khác biệt chính tôi thấy là mã của tôi cần phải gọi unwrap()
là tốt, nhưng thay đổi dòng cuối cùng để những điều sau đây không làm việc, hoặc:
let mut chars = lines.map(|x| x.unwrap());
let mut chars = chars.flat_map(|x| x.chars());
Nó không thành công trên dòng thứ hai, vì vậy vấn đề không xuất hiện là unwrap
.
Tại sao dòng cuối cùng này không hoạt động, khi dòng tương tự trong tài liệu không? Có cách nào để làm việc này không?
Ah, tôi thấy, cảm ơn! Tôi cho rằng những gì tôi đã nhầm lẫn là thực tế là tất cả các chức năng xử lý với 'Chuỗi' thay vì' & str', vì vậy có vẻ như nó sẽ di chuyển các giá trị. Nhưng đó không phải là trường hợp vì các bao đóng không trả lại các giá trị thực, mà là các trình vòng lặp mà sau này được đánh giá một cách lười biếng, và các trình vòng lặp đó chứa các tham chiếu đến đối tượng ban đầu. –
@ IanD.Scott Trong khi 'chars' có thể được gọi trên một' String', lưu ý rằng nó có '& self' (một tham chiếu) và nó thực sự được thực hiện thông qua' Deref', có nghĩa là việc thực hiện thực sự là trên 'str'. Do đó '& self' =>' & str'. – Shepmaster
Cảm ơn bạn đã lừa 'let() = x;' để xác định loại biến! –