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
at 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
推荐阅读
- postgresql - Postgres DB 突然记录所有 mod 语句
- macos - 如何在 MacOS 上使用 AVAudioEngine 将麦克风声音路由到扬声器?
- java - Springboot将应用程序yaml文件放在resources/config/文件夹中,运行JAR时找不到资源
- python - 在计算二元组 BOW 后尝试替换一行会产生不一致的形状错误
- jestjs - 如果提供了无效的测试模式,则停止 Jest 运行所有测试
- flutter - Flutter 2.0 迁移:_InternalLinkedHashMap
不是 Map 类型的子类型 ? 在类型转换中 - c# - 运行所选代码生成器时出现问题:“包还原失败”
- java - lombok 不起作用,即使它被添加为依赖项
- javascript - 在页面滚动时将图像旋转 -90 度
- cucumber - Cucumber - 场景标题中的变量而不在正文中使用它