我有一个像这样定义的Rust枚举
enum MyFirstEnum {
TupleType(f32, i8, String),
StuctType {varone: i32, vartwo: f64},
NewTypeTuple(i32),
SomeVarName
}
我有以下代码:
let mfe: MyFirstEnum = MyFirstEnum::TupleType(3.14, 1, "Hello".to_string());
我正在关注Rust文档,这看起来很好。我不需要在枚举中定义所有内容,但是如何访问枚举元组中的mid元素呢?
当我将它们添加到mfe.TupleType.1
时,mfe.1
和println!
不起作用
我知道Rust提供了进行模式匹配以获取值的工具,但是如果我更改代码以定义枚举中的其他变体,输出特定变体的代码很快就会变得混乱。
是否有一种简单的方法可以在枚举中输出元组(或任何其他变体)的变体?
这是一个常见的误解:枚举变体不是它们自己的类型(至少在Rust 1.9中)。因此,当您创建这样的变量时:
let value = MyFirstEnum::TupleType(3.14, 1, "Hello".to_string());
它是一个特定变体的事实立即“丢失”。您需要模式匹配以防止将枚举作为错误的变体访问。您可能更喜欢使用if let
语句而不是匹配:
if let MyFirstEnum::TupleType(f, i, s) = value {
// Values available here
println!("f: {:?}", f);
}
示例解决方案
enum MyFirstEnum {
TupleType(f32, i8, String),
// StuctType { varone: i32, vartwo: f64 },
// NewTypeTuple(i32),
// SomeVarName,
}
fn main() {
let mfe: MyFirstEnum = MyFirstEnum::TupleType(3.14, 1, "Hello".to_string());
let MyFirstEnum::TupleType(value, id, text) = &mfe;
println!("[{}; {}; {}]", value, id, text);
//or
match &mfe {
MyFirstEnum::TupleType(value, id, text) => {
println!("[{}; {}; {}]", value, id, text);
}
// _ => {}
}
}