Rust字符串校验:如何在迭代器中实现提前返回?
Rust迭代器实现提前返回:全字母数字字符串校验
需求:编写一个函数,仅当输入字符串为全字母数字时才执行后续操作;现有循环代码可通过提前返回false终止执行,希望改用迭代器简化代码,但尝试的迭代器代码无法编译。
现有可正常工作的循环代码
fn update(&mut self, input_string: String) -> bool { let chars = { let mut chars = Vec::new(); for c in input_string.chars() { if !c.is_alphanumeric() { return false } else { chars.push(c); } } chars }; // do something with chars todo!() }
尝试的迭代器代码(编译失败)
fn update(&mut self, input_string: String) -> bool { let chars = input_string.chars().into_iter().map(|c| { if c.is_alphanumeric() { c } else { return false } }); // do something with chars todo!() }
问题原因
这段迭代器代码编译失败有两个核心原因:
- 闭包内的
return false是返回闭包本身,而非外层的update函数; map要求闭包返回统一类型,这里分支分别返回char和bool,类型不匹配。
解决方案
方案1:使用try_fold(高效单遍历)
try_fold支持在迭代过程中提前返回错误值,既能完成字符收集,又能在遇到非法字符时立即终止迭代,仅需遍历一次字符串:
fn update(&mut self, input_string: String) -> bool { match input_string.chars().try_fold(Vec::new(), |mut acc, c| { if c.is_alphanumeric() { acc.push(c); Ok(acc) } else { Err(false) } }) { Ok(chars) => { // 在这里处理合法的chars集合 todo!(); true // 根据实际业务逻辑返回对应布尔值 } Err(false) => false, } }
方案2:先校验再收集(直观易读)
先通过all方法快速校验所有字符是否合法,合法再收集字符;缺点是会遍历字符串两次,适合字符串长度较短的场景:
fn update(&mut self, input_string: String) -> bool { if !input_string.chars().all(|c| c.is_alphanumeric()) { return false; } let chars: Vec<char> = input_string.chars().collect(); // 处理chars集合 todo!(); true }
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

