为什么在使用字段匹配类似结构的枚举变体的模式时会出现错误?

时间:2018-06-09 13:56:11

标签: enums rust pattern-matching

我无法解决此代码的错误:

#[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 :(得分:8)

Enum变体有三种可能的语法:

  • 单元

    enum A { One }
    
  • 元组

    enum B { Two(u8, bool) }
    
  • 结构

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

模式匹配时必须使用与变体定义为的语法相同的语法。

在这种情况下,您需要大括号和.. catch-all:

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

另见: