可以在枚举和向量内容之间生成匹配项

  • 本文关键字:之间 枚举 向量 rust
  • 更新时间 :
  • 英文 :


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

#[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,
}
}

此代码无法编译。

除了重复使用关键字type作为变量名称这一事实之外,无法推断 match 语句的返回类型。

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

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

应该推断foo什么类型?没有一致的选项,因为它依赖于运行时typ的值,因此不能用于在编译时定义其类型。

幸运的是,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

最新更新