从枚举中访问元组

时间:2016-05-30 01:13:32

标签: rust

我有一个像这样定义的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.1println!无法正常工作

我知道Rust提供了进行模式匹配以获取值的工具,但是如果我更改代码以定义枚举中的其他变体,输出特定变体的代码很快就会变得一团糟。

是否有一种简单的方法可以在枚举中输出元组(或任何其他变体)的变体?

2 个答案:

答案 0 :(得分:6)

这是一个常见的误解:枚举变体他们自己的类型(至少在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);
}

答案 1 :(得分:0)

示例解决方案:

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);
        }
       // _ => {}
    }

}

Playground link