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;
}