Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何筛选文件路径,然后使用生成的路径_File_File Io_Rust_Filepath - Fatal编程技术网

File 如何筛选文件路径,然后使用生成的路径

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

我试图从目录中获取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 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"));
}