首页 文章

从枚举中访问元组

提问于
浏览
3

我有一个像这样定义的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.1mfe.1 在我将它们添加到 println! 时不起作用

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

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

2 回答

  • 6

    这是一个常见的误解:枚举变体是 not 它们自己的类型(至少在Rust 1.9中) . 因此,当您创建这样的变量时:

    let value = MyFirstEnum::TupleType(3.14, 1, "Hello".to_string());
    

    它是一个特定变体的事实立即"lost" . 您需要模式匹配以防止将枚举作为错误的变体访问 . 您可能更喜欢使用 if let 语句而不是匹配:

    if let MyFirstEnum::TupleType(f, i, s) = value {
         // Values available here
         println!("f: {:?}", f);
    }
    
  • 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

相关问题