Rust for循环内使用Peekable迭代器报移动后借用错误如何解决
报错原因
for循环遍历迭代器时,会隐式调用迭代器的into_iter()方法,该方法会获取迭代器的所有权,将iter移动到for循环的内部逻辑中。此时循环体外部定义的iter变量已经失效,你在循环体内尝试调用iter.peek(),本质是在借用一个已经被移动走的值,因此触发E0382编译错误。
修复方案
改用while let循环手动驱动迭代器,全程持有迭代器的可变所有权,即可正常调用peek()预览下一个字符,代码如下:
let my_str = "12345"; let mut iter = my_str.chars().peekable(); while let Some(current) = iter.next() { let next = iter.peek().copied().unwrap_or('∅'); // 此处可将current、next传入其他业务方法 }
实现说明
iter.next()负责手动推进迭代流程,迭代器的所有权始终绑定在当前作用域的iter变量上,不会被转移peek()返回值类型为Option<&char>,由于char实现了Copy特征,调用copied()可以无开销地拿到Option<char>类型,无需手动解引用- 迭代到最后一个字符时,
peek()会返回None,通过unwrap_orfallback到预设的空标识字符'∅'即可
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

