为何这段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
相关产品推荐
相关产品推荐

