【问题标题】:Accessing tuple from within an enum从枚举中访问元组
【发布时间】:2016-09-27 17:44:53
【问题描述】:

我有一个这样定义的 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 文档,这看起来不错。我不需要在枚举中定义所有内容,但是我将如何访问枚举元组中的中间元素?

mfe.TupleType.1 和 mfe.1 在我将它们添加到 println! 时不起作用

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

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

【问题讨论】:

  • 请注意,显式类型 (let mfe: MyFirstEnum) 是不必要的。您已经在作业的右侧指定了类型。
  • 如果我更改代码以定义枚举中的其他变体,则输出特定变体的代码很快就会变得一团糟 — 你能扩展一下你的内容吗?这是什么意思?

标签: rust


【解决方案1】:

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

【讨论】:

  • This is a proposal 使枚举变体成为一种类型,但目前还没有决定,肯定不会出现在 1.11 之前。
  • @kennytm 谢谢你的链接,我懒得去挖掘它。这是我非常兴奋的潜在即将推出的 Rust 功能之一。
  • 哦,好吧。这个决定可能是一个解释,但仍然不是很清楚。最好将解决方案显示为代码示例,而不是片段。第一次我并不清楚这个决定。
  • 如果有人想跟踪枚举变体作为类型的进度,new RFC is here。
【解决方案2】:

示例解决方案:

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

【讨论】:

  • 这个例子有效,但我很困惑 println!() 中的 3 个变量前面没有枚举。应该注意的是,它起作用的原因是“解构”(在 Rust 书中有介绍)。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多