File 如何筛选文件路径,然后使用生成的路径
我试图从目录中获取mp3列表File 如何筛选文件路径,然后使用生成的路径,file,file-io,rust,filepath,File,File Io,Rust,Filepath,我试图从目录中获取mp3列表 let dir_paths = fs::read_dir(&Path::new("some_directory")).unwrap(); let paths = dir_paths.filter(|x| match x.unwrap().path().extension() { None => true, Some(ext) => ext == "mp3" }); 错误消息 src/main.rs:27:48: 27:49 e
let dir_paths = fs::read_dir(&Path::new("some_directory")).unwrap();
let paths = dir_paths.filter(|x| match x.unwrap().path().extension() {
None => true,
Some(ext) => ext == "mp3"
});
错误消息
src/main.rs:27:48: 27:49 error: cannot move out of borrowed content
src/main.rs:27 let paths = dir_paths.filter(|ref x| match x.unwrap().path().extension() {
^
我尝试将
|x |
替换为| ref x |
,但收到了相同的错误消息。正确的方法是什么?让我们看一下以下文档:
展开结果,生成确定的内容
注意如何使用self
?这意味着期权将被消费。但是,迭代器正在传递闭包a&Result
。您不能拥有选项的所有权,因为它是借用的
最短的修复方法是使用以下方法获得结果
:
虽然我可能会选择把它写成
use std::fs;
use std::ffi::OsStr;
fn main() {
let dir_paths = fs::read_dir("/").unwrap();
dir_paths
.filter_map(|x| x.ok())
.filter(|x| x.path().extension().and_then(OsStr::to_str) == Some("mp3"));
}
有一些较少的展开-我们只是忽略任何失败的DirEntry
s。但这取决于您的错误处理策略 你的版本好多了
use std::fs;
fn main() {
let dir_paths = fs::read_dir("/").unwrap();
let paths = dir_paths.filter(|x| match x.as_ref().unwrap().path().extension() {
None => true,
Some(ext) => ext == "mp3"
});
}
use std::fs;
use std::ffi::OsStr;
fn main() {
let dir_paths = fs::read_dir("/").unwrap();
dir_paths
.filter_map(|x| x.ok())
.filter(|x| x.path().extension().and_then(OsStr::to_str) == Some("mp3"));
}