Почему присвоение переменной в цикле перед оператором continue считается как никогда не прочитанное? - PullRequest
0 голосов
/ 26 августа 2018

По следующему коду:

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 голосов
/ 26 августа 2018

Компилятор не очень хорошо осведомлен о средствах управления прерыванием потока из-за ошибки .Если вы можете, вы должны использовать ориентированный на выражения синтаксис, который более идиоматичен:

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)
        }
    } 
}

или создать собственный итератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...