我正在试图弄清楚如何用铁锈做一个'列表理解'。我有一个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?
};
我知道我的表情很可能会被破坏,但有没有办法让这个表达能够file_names
绑定到?
答案 0 :(得分:20)
您可能希望使用Path
的{{1}}方法生成文件名,如果它是常规文件,这就是它返回{{1 }}
我想你想要忽略非常规文件的文件名,即file_name()
将返回Option
的文件名,在这种情况下你可能想要利用{{ 1}}的{{1}}方法基本上就像过滤器和地图放在一起,即你能够映射(在这种情况下是路径 - >文件名)并通过将映射结果作为{来过滤{1}},其中file_name()
表示您要过滤掉该值。
令人烦恼的是,您必须检查None
迭代器返回的每个项目,因为这是Iterator
类型,因此您必须查看它是否为filter_map
。如果您只想忽略目录中的非Option
(即None
)条目(例如您没有权限的条目),则可以将其简单地转换为ReadDir
使用Result
的{{1}}方法并将其整合到Ok
。
您还必须尝试从返回的Ok
创建Err
,因为它可能不一定是UTF-8。使用Option
和Result
的组合,可以简单地再次忽略具有非UTF-8名称的文件(在此示例中)。
如果你忽略了非ok()
目录条目和非常规文件的路径(因此在filter_map
上返回String
),它会是什么样子?文件名不是UTF-8的文件:
file_name()
如果您不熟悉Rust的功能流量控制功能,例如map
和and_then
上的Ok
,None
等等,然后这就是展开的内容,没有忽略错误而不做错误处理。我把它留给你:
file_name()