Rust中如何实现持续跳过符合条件元素的迭代器功能?
如何让Rust迭代器持续跳过符合条件的元素
Rust的Iterator方法skip_while有个特性:当闭包第一次返回false后,就会停止跳过逻辑,后续所有元素都会被返回。如果想要持续跳过所有符合条件的元素(不管之前有没有返回过false),可以用以下迭代器适配器方式实现:
先看原问题示例代码:
fn main() { let lines = [ "", "a", "", "b", "", "c", ]; for line in lines.iter().skip_while(|x| x.is_empty()) { println!("line is {:?}, {:?}", line, line.is_empty()); } }
它的输出是:
line is "a", false line is "", true line is "b", false line is "", true line is "c", false
我们期望的输出是只保留非空行:
line is "a", false line is "b", false line is "c", false
解决方案:使用filter适配器
直接用filter就能实现“持续跳过符合条件元素”的需求。filter会对迭代器的每一个元素执行判断闭包,只保留闭包返回true的元素(反过来就是跳过所有返回false的元素),完全符合场景要求。
修改后的代码:
fn main() { let lines = [ "", "a", "", "b", "", "c", ]; // 过滤掉所有空字符串,只保留非空元素 for line in lines.iter().filter(|x| !x.is_empty()) { println!("line is {:?}, {:?}", line, line.is_empty()); } }
核心区别
skip_while是前缀跳过:仅跳过开头连续符合条件的元素,遇到第一个不符合的就停止跳过逻辑filter是全局过滤:对每个元素都做判断,全程跳过符合条件的元素
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

