我想知道如何用rust做"列表理解".我有一个ReadDir iter,我想映射,只得到路径的文件名.我觉得它看起来像:

// get current dir paths
let paths = fs::read_dir(&Path::new(
    &env::current_dir().unwrap())).unwrap();

// should contain only filenames
let files_names = paths.map(|&x| {
    match (*x).extensions() {
        Some(y) => y,
        None => //What do I do here? break?
};

我知道我的表情很可能被 destruct 得可怕,但有没有办法让它成为一个我可以绑定file_names的单一表情?

推荐答案

您可能需要使用Pathfile_name()方法,该方法生成文件名if.这是一个常规文件,因此它返回Option.

I imagine you'd want to ignore the file names of things that aren't regular files, i.e. for which file_name() would return None, in which case you will probably want to leverage Iterator's filter_map method which is basically like filter and map put together, i.e. you're able to map (in this case the path -> file name) and filter by returning the mapped result as an Option, where None would signify that you want to filter that value out.

恼人的是,您必须判断ReadDir迭代器返回的每个项,因为这是Result类型,所以您必须查看它是否为Ok.如果您只想忽略目录中的非Ok个(即Err个)条目(例如您没有权限的条目),只需使用Resultok()方法将其转换为Option,并将其集成到filter_map中即可.

由于UTF也可能是从UTF file_name()返回的,所以它也可能不是从UTF file_name()返回的.使用mapand_then的组合,可以简单地再次忽略具有非UTF-8名称的文件(在本例中).

如果让它忽略非Ok个非常规文件的目录条目和路径(因此在file_name()上返回None)以及文件名不是UTF-8的文件,它会是这样的:

let paths = fs::read_dir(&Path::new(
  &env::current_dir().unwrap())).unwrap();

let names =
paths.filter_map(|entry| {
  entry.ok().and_then(|e|
    e.path().file_name()
    .and_then(|n| n.to_str().map(|s| String::from(s)))
  )
}).collect::<Vec<String>>();

playpen

如果您不太熟悉Rust的功能性流量控制功能,例如ResultOption上的mapand_then等,那么下面是它的扩展,without忽略错误,不进行错误处理.我让你来决定:

let paths = fs::read_dir(&Path::new(
  &env::current_dir().unwrap())).unwrap();

let names =
paths.map(|entry| {
  let entry = entry.unwrap();

  let entry_path = entry.path();

  let file_name = entry_path.file_name().unwrap();

  let file_name_as_str = file_name.to_str().unwrap();

  let file_name_as_string = String::from(file_name_as_str);

  file_name_as_string
}).collect::<Vec<String>>();

playpen

Rust相关问答推荐

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

将已知大小的切片合并成一个数组,

如何在Rust中实现Functor trait?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

如何使用syn插入 comments ?

为昂贵的for循环制作筛子

有没有一种惯用的方法来判断VEC中是否存在变体?

如何在Rust中将选项<;选项<;字符串>;转换为选项<;选项&;str>;?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

如何初始化选项<;T>;数组Rust 了?

sha256 摘要仅适用于 &*

在描述棋盘时如何最好地使用特征与枚举

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

使用 serde_json 进一步处理字段

当引用不再被borrow 时,Rust 不会得到它

返回 &str 但不是 String 时,borrow 时间比预期长