You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何可通过for构造遍历不可变迭代器?手动调用next()却报错?

为什么调用迭代器的next()方法需要声明可变迭代器?

你碰到的这个问题,本质是Rust所有权规则的典型体现——迭代器的next()方法会修改自身内部状态(比如移动遍历指针、记录已访问位置),所以它必须对迭代器进行可变借用。

先看你写的代码:

let x = vec![1, 2, 3];
let x_iter = x.iter(); // 这里声明的是不可变迭代器变量
loop {
    match x_iter.next() {
        Some(v) => { println!("{}", v); }
        None => { println!("end"); break; }
    }
}

编译器报错cannot borrow immutable local variable x_iter as mutable,核心原因是next()的方法签名(简化版)是这样的:

fn next(&mut self) -> Option<Self::Item>;

它明确要求self是可变引用,所以你必须把迭代器变量声明为mut,允许它被修改。

修正后的代码

只需要给迭代器变量加上mut修饰符即可:

let x = vec![1, 2, 3];
let mut x_iter = x.iter(); // 添加mut,让迭代器可变
loop {
    match x_iter.next() {
        Some(v) => { println!("{}", v); }
        None => { println!("end"); break; }
    }
}

这样编译器就会允许next()对迭代器进行可变借用,代码就能正常运行了。

另外补充个小技巧:Rust里遍历迭代器更常用的是for循环,它会自动处理迭代器的可变性,代码更简洁直观:

let x = vec![1, 2, 3];
for v in x.iter() {
    println!("{}", v);
}
println!("end");

这个写法和你用loop+match的效果完全一致,但可读性更高~

内容的提问来源于stack exchange,提问作者Jivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:29:47