Rust 为什么在continue语句之前循环中的变量赋值被视为从不读取?

Rust 为什么在continue语句之前循环中的变量赋值被视为从不读取?,rust,compiler-warnings,Rust,Compiler Warnings,关于以下代码: 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; }

关于以下代码:

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);
    } 
}
这是非常小的(因此请暂时忽略它将永远循环),但显示了问题:编译器似乎认为如果外部赋值覆盖了
,那么
中的
i
,这显然不是因为
continue


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

编译器没有很好地意识到流中断控件。如果可以,您应该使用更加惯用的面向表达式的语法:

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)
        }
    } 
}
fn main(){
设muti=None;
让mut cond=true;
而true和i.map_或(true,|x | x<10){
i=如果条件为{
cond=假;
部分(0)
}否则{
一些(5)
}
} 
}

或者创建自定义迭代器。

您不需要输入
i
的类型。由于行
i=Some(0)
,编译器知道
i
选项
,因为这是一个编译器错误,您可能只是接受警告,或者在本例中使用包含函数上的
#[allow(unused_assignments)]
来抑制它。嗯,我将尝试这样做,但至少可以说,这将是令人费解的。实际代码有一些
返回
s和
if let
s,这在一定程度上使表达式提取复杂化。