Частичное совпадение вариантов перечисления - PullRequest
0 голосов
/ 05 августа 2020

Предположим, что этот код:

pub enum Operations {
    Nop,
    Read,
    Write { content: Vec<u8> },
}

pub fn do_operation(op: Operations) {
    match op {
        Operations::Nop => {}
        rest => {
            // open a file
            match rest {
                Operations::Read => {
                    // read file
                }
                Operations::Write { .. } => {
                    // write file
                }
            }
        }
    }
}

Как видите, у меня есть три варианта, в двух из которых я хотел бы проделать аналогичные операции (в этом случае открыть файл и что-то с ним сделать ). Но с третьим вариантом я хочу выполнить операцию, которая вообще не требует открытия файла.

В настоящее время rust отказывается компилировать этот код:

error[E0004]: non-exhaustive patterns: `Nop` not covered
  --> src/lib.rs:12:19
   |
1  | / pub enum Operations {
2  | |     Nop,
   | |     --- not covered
3  | |     Read,
4  | |     Write { content: Vec<u8> },
5  | | }
   | |_- `Operations` defined here
...
12 |               match rest {
   |                     ^^^^ pattern `Nop` not covered
   |
   = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
   = note: the matched value is of type `Operations`

ИМХО, это должно быть компилятор обнаружил, что Operations::Nop больше невозможно.

Есть ли способ заставить эту работу работать, например, активировав ночные функции или используя обходной путь? Есть ли на github открытая проблема, которая уже предлагает такое частичное соответствие?

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