Почему я получаю сообщение об ошибке при сопоставлении шаблона со структурным вариантом перечисления с полями? - PullRequest
0 голосов
/ 09 июня 2018

Я не могу избавиться от ошибки в этом коде:

#[derive(PartialEq, Copy, Clone)]
pub enum OperationMode {
    ECB,
    CBC { iv: [u8; 16] },
}

pub struct AES {
    key: Vec<u8>,
    nr: u8,
    mode: OperationMode,
}

impl AES {
    pub fn decrypt(&mut self, input: &Vec<u8>) {
        match self.mode {
            OperationMode::ECB => {},
            OperationMode::CBC(_) => {},
        };
    }
}

Совпадение с шаблоном в конце функции decrypt выдает ошибку:

error[E0532]: expected tuple struct/variant, found struct variant `OperationMode::CBC`
  --> src/main.rs:17:13
   |
17 |             OperationMode::CBC(_) => {},
   |             ^^^^^^^^^^^^^^^^^^ did you mean `OperationMode::CBC { /* fields */ }`?

Он говорит мне посмотреть на вывод rustc --explain E0532 для справки, что я и сделал.

Они показывают этот пример неправильного кода:

enum State {
    Succeeded,
    Failed(String),
}

fn print_on_failure(state: &State) {
    match *state {
        // error: expected unit struct/variant or constant, found tuple
        //        variant `State::Failed`
        State::Failed => println!("Failed"),
        _ => ()
    }
}

В этомНапример, ошибка возникает потому, что State::Failed имеет поле, которое не соответствует.Это должно быть State::Failed(ref msg).

В моем случае я сопоставляю поле моего перечисления, потому что я делаю OperationMode::CBC(_).Почему происходит ошибка?

1 Ответ

0 голосов
/ 09 июня 2018

Варианты Enum имеют три возможных синтаксиса:

  • unit

    enum A { One }
    
  • кортеж

    enum B { Two(u8, bool) }
    
  • struct

    enum C { Three { a: f64, b: String } }
    

При сопоставлении с образцом необходимо использовать тот же синтаксис, что и синтаксис, для которого был определен вариант.

В этом случае вынужны фигурные скобки и .. всеобъемлющее:

OperationMode::CBC { .. } => {}

См. также:

...