Почему этот код не компилируется?
use std::{fs, path::Path};
fn main() {
let dir = Path::new("../FileSystem");
if !dir.is_dir() {
println!("Is not a directory");
return;
}
for item in try!(fs::read_dir(dir)) {
let file = match item {
Err(e) => {
println!("Error: {}", e);
return;
}
Ok(f) => f,
};
println!("");
}
println!("Done");
}
Это ошибка, которую я получаю
error[E0308]: mismatched types
--> src/main.rs:11:17
|
11 | for item in try!(fs::read_dir(dir)) {
| ^^^^^^^^^^^^^^^^^^^^^^^ expected (), found enum 'std::result::Result'
|
= note: expected type '()'
found type 'std::result::Result<_, _>'
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
Я также попробовал оператор вопросительного знака:
for item in fs::read_dir(dir)? {
Который имел другую ошибку:
error[E0277]: the '?' operator can only be used in a function that returns 'Result' or 'Option' (or another type that implements 'std::ops::Try')
--> src/main.rs:11:17
|
11 | for item in fs::read_dir(dir)? {
| ^^^^^^^^^^^^^^^^^^ cannot use the '?' operator in a function that returns '()'
|
= help: the trait 'std::ops::Try' is not implemented for '()'
= note: required by 'std::ops::Try::from_error'
Предыдущие версии Rust имели аналогичную ошибку в отношении std::ops::Carrier
Должен ли я избегать try!()
И ?
? Каков наилучший способ обработки ошибок? В основном я делаю это так:
match error_prone {
Err(e) => {
println!("Error: {}", e);
return;
},
Ok(f) => f,
};
Но если я должен использовать это в цикле for
, это полный беспорядок
for i in match error_prone {
// match code
} {
// loop code
}