我目前有以下功能:
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()还是不正确的用法。
这里的错误有点误导,您可以收集到 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)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |