为什么在 continue 语句之前循环中的变量赋值算作从未读过?

Why does a variable assignment in a loop before a continue statement count as never read?

关于以下代码:

fn main() {
    let mut i: Option<i32> = None;

    let mut cond = true;
    while true && i.map_or(true, |x| x < 10) {
        if cond {
            cond = false;
            i = Some(0);
            continue;
        }
        i = Some(5);
    } 
}

我收到警告:

warning: value assigned to `i` is never read
 --> src/lib.rs:8:13
  |
8 |             i = Some(0);
  |             ^
  |
  = note: #[warn(unused_assignments)] on by default

这是非常小的(所以请暂时忽略它会永远循环),但显示了问题:编译器似乎认为 if 内部的 i 被覆盖了由外部分配,由于 continue.

显然不是这种情况

我是不是遗漏了什么,是不是我在程序中引入了某种描述的错误,还是编译器的错误?

编译器不太了解流程中断控件because of a bug。如果可以,您应该使用更惯用的面向表达式的语法:

fn main() {
    let mut i = None;

    let mut cond = true;
    while true && i.map_or(true, |x| x < 10) {
        i = if cond {
            cond = false;
            Some(0)
        } else {
            Some(5)
        }
    } 
}

或创建自定义迭代器。