Почему я не получаю ошибку об использовании возможно неинициализированного значения в одном совпадении, но не в другом совпадении, которое использует `panic`? - PullRequest
0 голосов
/ 15 января 2020
const FILE_NAME: &str = "/tmp/main.rs";

fn main() {
    println!("Hello, world!");
    let metadata;
    match std::fs::metadata(FILE_NAME) {
        Ok(meta_data) => {
            metadata = meta_data;
            println!("metadata: {:?}", metadata);
        }
        _ => {
            panic!("not meta enough!");
        }
    }

    let modified: std::time::SystemTime;
    match metadata.modified() {
        Ok(x) => {
            modified = x;
            println!("modified: {:?}", modified); // this works
        }
        _ => (),
    }

    // println!("modified: {:?}", modified); //-> this does not work
    let len = metadata.len();
    println!("metadata: {:?}", metadata);
    println!("len: {}", len);
}

Я не понимаю, почему происходит сбой, если я раскомментирую строку 22:

error[E0381]: borrow of possibly-uninitialized variable: `modified`
  --> src/main.rs:25:32
   |
25 |     println!("modified: {:?}", modified); //-> this does not work
   |                                ^^^^^^^^ use of possibly-uninitialized `modified`

Тот же код в строке 18 работает нормально. Что я пропускаю?

1 Ответ

2 голосов
/ 15 января 2020

В строке проблемных c Rust не может быть уверен, что modified действительно инициализирован.

Альтернативой может быть досрочный возврат, если невозможно установить modified:

fn main() {
    println!("Hello, world!");
    let metadata;
    match std::fs::metadata("dsf") {
        Ok(meta_data) => {
            metadata = meta_data;
            println!("metadata: {:?}", metadata);
        }
        _ => {
            panic!("not meta enough!");
        }
    }

    let modified: std::time::SystemTime = match metadata.modified() {
        Ok(x) => {
            println!("modified is set to {:?}", x); // this works
            x
        }
        _ => return, // early return on error
    };

    println!("modified: {:?}", modified);
    let len = metadata.len();
    println!("metadata: {:?}", metadata);
    println!("len: {}", len);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...