Избегайте «использования возможно неинициализированной переменной» в структуре «совпадения», которая недоступна, когда переменная не определена в Rust - PullRequest
0 голосов
/ 02 октября 2018

Я пишу консольное приложение Rust.Он принимает свой первый аргумент и решает, в каком режиме работать. Если первый аргумент не определен или неизвестен, приложение должно завершиться.Вот код:

use std::env;
use std::process;

enum RunMode {
    Extract,
}

fn die_with_error(error: &str) {
    eprintln!("{}", &error);
    process::exit(-1);
}

fn main() {
    let mut args = env::args();
    args.next();
    let mut runmode;

    match args.next() {
        Some(arg) => {
            match arg.as_ref() {
                "extract" => runmode = RunMode::Extract,
                _ => die_with_error(&format!("Unknown mode {}", &arg.to_string())),
            };
        }
        None => die_with_error("No mode specified. Please specify a mode as a first argument. Use --help to get a list of modes available"),
    };

    match runmode {
        RunMode::Extract => {
            let file_name = args
                .next()
                .expect("Please specify a filename as a second argument");
            println!("You passed {}", file_name);
        }
    }
}

Он не компилируется и выдает следующую ошибку:

error[E0381]: use of possibly uninitialized variable: `runmode`
  --> src/main.rs:27:11
   |
27 |     match runmode {
   |           ^^^^^^^ use of possibly uninitialized `runmode`

Я понимаю, что существуют ситуации, когда режим выполнения может быть неопределенным, но в этих ситуацияхстрока 27 с match никогда не будет достигнута.Я могу избежать, определив значение по умолчанию для режима выполнения, но это не кажется чистым.Как правильно бороться с этим в Rust?

1 Ответ

0 голосов
/ 02 октября 2018

С точки зрения компилятора, когда вы вызываете die_with_error(), ваша функция не возвращает значение вызывающей стороне.В действительности эта функция не только ничего не возвращает, она вообще не возвращает.Способ выразить это в Rust с помощью никогда не набирать !:

fn die_with_error(error: &str) -> ! {
    eprintln!("{}", &error);
    process::exit(-1)
}

С этим изменением компилятор будет знать, что runmode всегда должно иметь инициализированное значение.

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