【问题标题】:How to get access to enum variant unnamed field?如何访问枚举变体未命名字段?
【发布时间】:2018-09-02 06:26:05
【问题描述】:

我想打印没有命名字段的元组枚举数据。

元组是一种将具有多种类型的一些其他值组合成一个复合类型的通用方法。

#[derive(Debug)]
enum Coin {
    Penny(String),
    Nickel { id: String },
}

fn main() {
    let penny = Coin::Penny(String::from("penny"));
    let nickel: Coin = Coin::Nickel { id: String::from("nickel") };

    println!("{} {:?} ", penny.0, penny);
    println!("{:?}", nickel);
}

在这个例子中,Nickel 是一个类似结构的枚举变体,而Penny 被简单地称为enum variant

我得到一个编译器错误:

error[E0609]: no field `0` on type `Coin`
For more information about this error, try `rustc --explain E0609`.

【问题讨论】:

    标签: enums rust


    【解决方案1】:

    您可以使用match 语句或if let 语句来使用变体的关联值:

    #[derive(Debug)]
    enum Coin {
        Penny(String),
        Nickel { id: String },
    }
    
    fn main() {
        let penny = Coin::Penny(String::from("penny"));
        let nickel: Coin = Coin::Nickel {
            id: String::from("nickel"),
        };
    
        if let Coin::Penny(name) = penny {
            println!("{}", name);
        }
    
        if let Coin::Nickel{ id } = nickel {
            println!("{}", id);
        }
    }
    

    Playground link

    【讨论】:

      【解决方案2】:

      使用match 语句的示例:

      #[derive(Debug)]
      enum Coin {
          Penny(String),
          Nickel { id: String },
      }
      
      fn main() {
          let penny = Coin::Penny(String::from("penny"));
          let nickel: Coin = Coin::Nickel {
              id: String::from("nickel"),
          };
      
          match &penny {
              Coin::Penny(id) => {
                  println!("{}; {:?}", id, penny);
              }
              _ => {}
          }
      
          match &nickel {
              Coin::Nickel { id } => {
                  println!("{}; {:?}", id, nickel);
              }
              _ => {}
          }
      }
      

      Playground link

      【讨论】:

      • 如果值是动态的并且我们不知道哪个变体怎么办
      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多