Nodoid
Nodoid

Reputation: 1581

Accessing tuple from within an enum

I have a Rust enum defined like this

enum MyFirstEnum {
    TupleType(f32, i8, String),
    StuctType {varone: i32, vartwo: f64},
    NewTypeTuple(i32),
    SomeVarName
}

I have the following code:

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

I'm following the Rust documentation and this looks fine. I don't need to define everything in the enum, but how would I go about accessing the mid element in the enum tuple?

mfe.TupleType.1 and mfe.1 don't work when I add them to a println!

I know Rust provides the facility to do pattern matching to obtain the value, but if I changed the code to define the other variants within the enum, the code to output a particular variant would quickly become a mess.

Is there a simple way to output the variant of the tuple (or any other variant) in the enum?

Upvotes: 11

Views: 13433

Answers (2)

Anatolii Kosorukov
Anatolii Kosorukov

Reputation: 960

Example solution:

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

Upvotes: 4

Shepmaster
Shepmaster

Reputation: 431599

This is a common misconception: enum variants are not their own types (at least in Rust 1.9). Therefore when you create a variable like this:

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

The fact that it's a specific variant is immediately "lost". You will need to pattern match to prevent accessing the enum as the wrong variant. You may prefer to use an if let statement instead of a match:

if let MyFirstEnum::TupleType(f, i, s) = value {
     // Values available here
     println!("f: {:?}", f);
}

Upvotes: 16

Related Questions