Rust 处理io::结果<;DirEntry>;一错再错
我正在尝试处理迭代Rust 处理io::结果<;DirEntry>;一错再错,rust,Rust,我正在尝试处理迭代std::fs::read_dir()函数的items返回的io::Result。我关心的是当应用match时如何从Result中获取DirEntry的值 let files = match fs::read_dir(&dir_path) { Ok(items) => items, //I actually want to leave function if there is an error here Err(_) => retur
std::fs::read_dir()
函数的items
返回的io::Result
。我关心的是当应用match
时如何从Result
中获取DirEntry
的值
let files = match fs::read_dir(&dir_path) {
Ok(items) => items,
//I actually want to leave function if there is an error here
Err(_) => return Err("Cannot read directory items".to_string()),
};
for item in files { // item: io::Result<DirEntry>
match item {
Ok(de) => de,// how to get `de` out of this scope??
//here I just want to print error and loop for next item
Err(_) => println!("{:?} cannot be accessed", item),
};
//do something with `de`
}
在这种情况下,可能有更好的方法来处理
结果
,而不使用匹配
。在匹配
之外声明变量的尝试是正确的。由于没有强制执行流前进到Err
分支上的下一个迭代,因此您得到了一个关于可能未初始化的变量的错误。您可以通过将continue
添加到Err
分支来执行此操作。然后,通过将match
表达式的结果直接分配给变量,可以用与文件
变量相同的方式初始化变量
for item in files {
let file = match item {
Ok(de) => de,
Err(_) => {
println!("{:?} cannot be accessed", item);
continue;
}
};
// do something with file
file;
}
看起来你不需要把它移出这个范围,你可以做
Ok(de)=>{/*用de*/},
我知道我可以做,但是我想尽量避免嵌套。谢谢你的帮助,我现在明白了继续
的必要性。
for item in files {
let file = match item {
Ok(de) => de,
Err(_) => {
println!("{:?} cannot be accessed", item);
continue;
}
};
// do something with file
file;
}