如何将迭代器收集到结果中?

cog*_*gle 1 rust

我目前有以下功能:

fn filter_files<P>(input_path: P) -> Result<Vec<DirEntry>, Box<dyn error::Error>> where P: AsRef<Path> {
    fs::read_dir(input_path)?
        .into_iter()
        .filter_map(|res| res.ok())
        .filter(|dir_entry| dir_entry.file_name().to_str().unwrap().starts_with("_x"))
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

我试图过滤掉以_x. 我想让这个函数Vec<DirEntry>直接返回过滤后的结果,而不必创建变量。我的问题是我无法获得正确的函数签名。我收到错误

error[E0277]: a value of type `Result<Vec<DirEntry>, Box<dyn std::error::Error>>` cannot be built from an iterator over elements of type `DirEntry`
    --> src/main.rs:18:10
     |
18   |         .collect()
     |          ^^^^^^^ value of type `Result<Vec<DirEntry>, Box<dyn std::error::Error>>` cannot be built from `std::iter::Iterator<Item=DirEntry>`
Run Code Online (Sandbox Code Playgroud)

我想知道这个函数的返回类型的正确签名应该是什么,以便它fs::read_dir(...)可以返回一个io::Error我知道我需要返回一个Result类型。这是正确的用法collect()还是不正确的用法。

caf*_*e25 5

这里的错误有点误导,您可以收集到 aResult但只有当迭代器项的类型为Result<A, E>时。

由于您知道所有项目都存在并且没有导致错误(您的项目属于DirEntrynot类型Result<DirEntry, _>),因此您想要做的是将已知的良好结果包装在Result诸如以下的变体中Ok

fn filter_files<P>(input_path: P) -> std::io::Result<Vec<DirEntry>> where P: AsRef<Path> {
    Ok(fs::read_dir(input_path)?
        .into_iter()
        .filter_map(|res| res.ok())
        .filter(|dir_entry| dir_entry.file_name().to_str().unwrap().starts_with("_x"))
        .collect())
}
Run Code Online (Sandbox Code Playgroud)