如何在Rust中实现迭代器遇首个不满足断言元素即停止迭代?
Rust中获取开头连续满足断言的元素
你需要的是只保留开头连续满足断言的元素,遇到第一个不满足的就立即停止迭代,原代码用filter会遍历整个集合并保留所有满足条件的元素,显然不符合需求。
直接用Rust标准库提供的take_while迭代器适配器就能解决这个问题:
fn first_predicate<F>(vec: Vec<i32>, f: F) -> Vec<i32> where F: FnMut(&i32) -> bool, { vec.into_iter().take_while(f).collect() }
为什么这个可行?
take_while的逻辑是:逐个迭代元素,只要断言返回true就将元素加入结果;一旦遇到第一个让断言返回false的元素,立刻终止迭代,后续所有元素都不会被处理。完全匹配你“取开头连续满足组”的需求。
测试示例
fn main() { let nums = vec![2, 4, 6, 3, 8, 10]; let even_prefix = first_predicate(nums, |&x| x % 2 == 0); println!("{:?}", even_prefix); // 输出 [2, 4, 6] }
内容的提问来源于stack exchange,提问作者St.Antario
相关产品推荐
相关产品推荐

