【问题标题】:Is there a way to print enum values?有没有办法打印枚举值?
【发布时间】:2015-03-17 10:38:30
【问题描述】:

有没有简单的方法来格式化和打印枚举值?我预计他们会有std::fmt::Display 的默认实现,但情况似乎并非如此。

enum Suit {
    Heart,
    Diamond,
    Spade,
    Club
}

fn main() {
    let s: Suit = Suit::Heart;
    println!("{}", s);
}

所需输出:Heart

错误:

error[E0277]: the trait bound `Suit: std::fmt::Display` is not satisfied
  --> src/main.rs:10:20
   |
10 |     println!("{}", s);
   |                    ^ the trait `std::fmt::Display` is not implemented for `Suit`
   |
   = note: `Suit` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
   = note: required by `std::fmt::Display::fmt`

【问题讨论】:

    标签: enums rust


    【解决方案1】:

    您可以派生std::format::Debug 的实现:

    #[derive(Debug)]
    enum Suit {
        Heart,
        Diamond,
        Spade,
        Club
    }
    
    fn main() {
        let s = Suit::Heart;
        println!("{:?}", s);
    }
    

    不可能派生Display,因为Display 旨在向人类显示,编译器无法自动决定哪种样式适合这种情况。 Debug 面向程序员,因此可以自动生成内部暴露视图。

    【讨论】:

    • 这不是答案
    • 对于带有附加值的枚举,例如Heart(u8),其中 u8 可以是从 ace = 1、2 到 13(10、J、Q、K)的牌号;是否可以只输出枚举名称,而不是值; Heart 而不是 Heart(7)?
    【解决方案2】:

    Debug trait 打印出 Enumvariant 的名称。

    如果您需要格式化输出,您可以为您的Enum 实现Display,如下所示:

    use std::fmt;
    
    enum Suit {
        Heart,
        Diamond,
        Spade,
        Club
    }
    
    impl fmt::Display for Suit {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
           match *self {
               Suit::Heart => write!(f, "♥"),
               Suit::Diamond => write!(f, "♦"),
               Suit::Spade => write!(f, "♠"),
               Suit::Club => write!(f, "♣"),
           }
        }
    }
    
    fn main() {
        let heart = Suit::Heart;
        println!("{}", heart);
    }
    

    【讨论】:

    • 为什么当我尝试这样写时,它总是打印第一个Heart => write!(f, "♥")Diamond => write!(f, "♦")
    • 要打印 ♦ 您需要创建对Suit::Diamond 的引用,然后打印它。例如let diamond = Suit::Diamond; println!("{}", diamond);
    【解决方案3】:

    结合DK.Matilda Smeds 的答案以获得更简洁的版本:

    use std::fmt;
    
    #[derive(Debug)]
    enum Suit {
        Heart,
        Diamond,
        Spade,
        Club
    }
    
    impl fmt::Display for Suit {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
           write!(f, "{:?}", self)
        }
    }
    
    fn main() {
        let heart = Suit::Heart;
        println!("{}", heart);
    }
    

    【讨论】:

      【解决方案4】:

      如果您想为枚举变体自动生成Display 实现,您可能需要使用strum crate:

      #[derive(strum_macros::Display)]
      enum Suit {
          Heart,
          Diamond,
          Spade,
          Club,
      }
      
      fn main() {
          let s: Suit = Suit::Heart;
          println!("{}", s); // Prints "Heart"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2017-12-05
        • 2014-02-17
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多