首页 > 解决方案 > 可以在枚举和向量的内容之间生成匹配

问题描述

我要做的是用不同类型的数据在枚举中定义值,然后将这些值填充到向量中。然后在该向量和该枚举之间进行匹配,以便它返回枚举包含的值

#[derive(Debug)]
enum Types {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let type = vec![Types::Int(3),Types::Float(3.3),Types::Text("Hi".to_string())];
    println!("{:?}",&type[0]);
    //if let Types::Int(number) = &type[0] {println!("{:?}",number)}

    println!("{:?}",Types::Int(3));
    match &type {
        Types::Int(number) => number,
        Typer::Float(float) => float,
        _=> None,
    }

}

标签: rust

解决方案


此代码无法编译。

除了将关键字重用为变量名这一事实之外,type无法推断匹配语句的返回类型。

在 match 表达式的每个分支中,代码返回不同的类型。在第一个中i32,在第二个中,f64在第三个中,一个Option变体。如果您尝试分配结果,这将变得更加明显。

let foo: <????> = match &typ {
    Types::Int(number) => number,
    Types::Float(float) => float,
    _ => None,
};

应该推断什么类型foo?没有一致的选项,因为它取决于typat runtime的值,因此不能用于在编译时定义其类型。

幸运的是,Rust 编译器非常棒,你可以在错误消息中看到这一点(在修复其他问题之后)。

error[E0308]: `match` arms have incompatible types
  --> src/main.rs:16:32
   |
14 | /     match typ[0] {
15 | |         Types::Int(number) => number,
   | |                               ------ this is found to be of type `i32`
16 | |         Types::Float(float) => float,
   | |                                ^^^^^ expected `i32`, found `f64`
17 | |         _=> None,
18 | |     }
   | |_____- `match` arms have incompatible types

error: aborting due to previous error

推荐阅读