Rust如何实现返回过滤谓词的函数用于迭代器filter筛选
问题原因
你的代码有两个核心错误导致无法运行:
- 闭包返回值不匹配:
filter方法要求传入的谓词必须返回bool类型,你声明的返回类型impl FnMut(&str)没有指定返回值,默认是单元类型(),和filter的要求不兼容。 - 性能冗余:每次将字符串转为
Vec<char>再取索引会产生多余的内存分配,完全可以直接用字符迭代器的nth()方法取值。
另外边界场景下如果n超过字符串的字符长度,unwrap()会直接触发panic,建议根据业务需求调整异常处理逻辑。
修正后的实现
fn create_predicate(character: char, n: usize) -> impl Fn(&str) -> bool { move |x: &str| { // 长度不足时默认返回false过滤,需要panic的话可以换成 x.chars().nth(n).unwrap() == character x.chars().nth(n).map_or(false, |c| c == character) } }
使用示例
let n = 0; // 可动态修改 let co2: Vec<String> = co2 .into_iter() .filter(create_predicate('q', n)) .collect();
内容的提问来源于stack exchange,提问作者Sebastian Berglönn
相关产品推荐
相关产品推荐

