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

为何这段while let循环会陷入无限循环?

为什么这段Rust代码会陷入无限循环?

先看你提供的测试代码:

#[test]
fn test_looping() {
    let index: usize = 2;
    while let Some(index) = index.checked_sub(1) {
        println!("{}", index);
    }
}

问题根源:变量遮蔽而非修改

你这里的核心误解是把变量遮蔽当成了变量修改。

  • 外层的index是用let定义的不可变变量,值固定为2。
  • while let Some(index) = index.checked_sub(1)里,右边的index始终是外层的那个不可变变量(值为2),每次调用checked_sub(1)都会得到Some(1)。
  • 左边的index是模式匹配时新创建的同名变量,它只是遮蔽了外层的index,但完全不影响外层变量的值。循环体里打印的是这个新变量,但外层的index依然是2,所以下一次循环还是用2去减1,永远得到Some(1),自然就无限循环了。

解决方法:使用可变变量并更新

要实现你预期的逻辑,需要把外层的index声明为可变(mut),然后在循环里更新它的值:

#[test]
fn test_looping() {
    let mut index: usize = 2;
    while let Some(new_index) = index.checked_sub(1) {
        println!("{}", new_index);
        index = new_index;
    }
}

这里我们用new_index接收checked_sub的结果,然后把它赋值给可变的外层index,这样每次循环都会用更新后的值去计算下一次的结果,直到checked_sub返回None(当index为0时),循环就会终止。

你也可以用更简洁的写法,直接在模式里用不同的变量名,避免遮蔽带来的混淆:

#[test]
fn test_looping() {
    let mut index = 2;
    while let Some(i) = index.checked_sub(1) {
        println!("{}", i);
        index = i;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:41:05