gpt4 book ai didi

rust - 是否可以使用Iterator::filter_map添加条件过滤?

转载 作者:行者123 更新时间:2023-12-03 11:37:57 26 4
gpt4 key购买 nike

此代码在/tmp文件夹中移动,以显示以.txt结尾的文件:

const FOLDER_NAME: &str = "/tmp";
const PATTERN: &str = ".txt";

use std::error::Error;
use walkdir::WalkDir; // 2.2.9

fn main() -> Result<(), Box<dyn Error>> {
println!("Walking folder {}", FOLDER_NAME);

for entry in WalkDir::new(FOLDER_NAME).into_iter().filter_map(|e| e.ok()) {
let x = entry.file_name().to_str();
match x {
Some(x) if x.contains(PATTERN) => println!("This file matches: {:?}", entry),
_ => (),
}
}
Ok(())
}

尽管这可行,但是否有可能利用 filter_map进行 match中当前正在发生的后缀过滤?

最佳答案

当条件为true时,您需要返回包装在Some中的条目:

use std::error::Error;
use walkdir::WalkDir; // 2.2.9

const FOLDER_NAME: &str = "/tmp";
const PATTERN: &str = ".txt";

fn main() -> Result<(), Box<dyn Error>> {
println!("Walking folder {}", FOLDER_NAME);

let valid_entries = WalkDir::new(FOLDER_NAME)
.into_iter()
.flat_map(|e| e)
.flat_map(|e| {
let name = e.file_name().to_str()?;
if name.contains(PATTERN) {
Some(e)
} else {
None
}
});

for entry in valid_entries {
println!("This file matches: {:?}", entry);
}

Ok(())
}

您会注意到,我已经 secret 切换到 Iterator::flat_mapIterator::filter_map也可以使用,但是我发现 flat_map更符合人体工程学,尤其是在您“忽略错误”的情况下。

与常规的 Iterator::filter调用相比,这是否有用还存在争议:
let valid_entries = WalkDir::new(FOLDER_NAME)
.into_iter()
.flat_map(|e| e)
.filter(|e| {
e.file_name()
.to_str()
.map_or(false, |n| n.contains(PATTERN))
});

也可以看看:
  • Why does `Option` support `IntoIterator`?
  • How can I filter an iterator when the predicate returns a Result<bool, _>?
  • 关于rust - 是否可以使用Iterator::filter_map添加条件过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557852/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com