Rust 是否可以使用迭代器::过滤器\映射来添加条件过滤?

Rust 是否可以使用迭代器::过滤器\映射来添加条件过滤?,rust,Rust,此代码遍历/tmp文件夹以显示以.txt结尾的文件: const FOLDER_NAME: &str = "/tmp"; const PATTERN: &str = ".txt"; use std::error::Error; use walkdir::WalkDir; // 2.2.9 fn main() -> Result<(), Box<dyn Error>> { println!("Walking folder {}", FOLD

此代码遍历
/tmp
文件夹以显示以
.txt
结尾的文件:

const FOLDER_NAME: &str = "/tmp";
const PATTERN: &str = ".txt";

use std::error::Error;
use walkdir::WalkDir; // 2.2.9

fn main() -> Result<(), Box<dyn Error>> {
    println!("Walking folder {}", FOLDER_NAME);

    for entry in WalkDir::new(FOLDER_NAME).into_iter().filter_map(|e| e.ok()) {
        let x = entry.file_name().to_str();
        match x {
            Some(x) if x.contains(PATTERN) => println!("This file matches: {:?}", entry),
            _ => (),
        }
    }
    Ok(())
}
const文件夹名称:&str=“/tmp”;
常量模式:&str=“.txt”;
使用std::error::error;
使用walkdir::walkdir;//2.2.9
fn main()->结果{
println!(“移动文件夹{}”,文件夹名称);
用于WalkDir::new(文件夹名称)中的条目。输入到iter()中。过滤映射(| e | e.ok()){
设x=entry.file_name().to_str();
匹配x{
如果x.contains(PATTERN)=>println!(“此文件匹配:{:?}”,条目),则为某些(x),
_ => (),
}
}
好(())
}

尽管这是可行的,但是否可以利用
过滤器映射
来执行当前在
匹配
中发生的后缀过滤?

当条件为真时,您需要返回包装在
部分
中的条目:

use std::error::Error;
use walkdir::WalkDir; // 2.2.9

const FOLDER_NAME: &str = "/tmp";
const PATTERN: &str = ".txt";

fn main() -> Result<(), Box<dyn Error>> {
    println!("Walking folder {}", FOLDER_NAME);

    let valid_entries = WalkDir::new(FOLDER_NAME)
        .into_iter()
        .flat_map(|e| e)
        .flat_map(|e| {
            let name = e.file_name().to_str()?;
            if name.contains(PATTERN) {
                Some(e)
            } else {
                None
            }
        });

    for entry in valid_entries {
        println!("This file matches: {:?}", entry);
    }

    Ok(())
}
另见:


当前的
.filter_映射(|e | e.ok())
忽略错误的行为是故意的吗?是的,/tmp中有几个文件夹我没有权限。例如,
Err(错误{depth:1,内部:Io{path:Some(/tmp/ssh-91erCI9EbnQJ)),Err:Os{code:13,种类:PermissionDenied,消息:“Permission denied”}})
let valid_entries = WalkDir::new(FOLDER_NAME)
    .into_iter()
    .flat_map(|e| e)
    .filter(|e| {
        e.file_name()
            .to_str()
            .map_or(false, |n| n.contains(PATTERN))
    });