为什么在continue语句之前的循环中变量分配算作从未读取?

时间:2018-08-26 16:47:03

标签: 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;
        }
        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

这是最小化的(因此请永远忽略,因为它会永远循环),但是显示了一个问题:编译器似乎认为i内部的if被外部分配,由于continue显然不是这种情况。

我是否丢失了某些东西,是否在程序中引入了某种描述性的错误,或者是编译器的错误?

1 个答案:

答案 0 :(得分:7)

编译器不太了解流中断控件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)
        }
    } 
}

或创建自定义迭代器。