有没有办法打印枚举值?

Dan*_*aft 24 enums rust

有没有简单的方法来格式化和打印枚举值?我希望他们有一个默认的实现std::fmt::Display,但似乎并非如此.

enum Suit {
    Heart,
    Diamond,
    Spade,
    Club
}

fn main() {
    let s: Suit = Suit::Heart;
    println!("{}", s);
}
Run Code Online (Sandbox Code Playgroud)

期望的输出: 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`
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 42

您可以派生出一个实现std::format::Debug:

#[derive(Debug)]
enum Suit {
    Heart,
    Diamond,
    Spade,
    Club
}

fn main() {
    let s = Suit::Heart;
    println!("{:?}", s);
}
Run Code Online (Sandbox Code Playgroud)

导出是不可能的,Display因为Display它旨在向人类显示,并且编译器无法自动决定该情况的适当样式.Debug适用于程序员,因此可以自动生成内部公开视图.

  • OP 要求“一种格式化和打印枚举值的简单方法”。这是所有答案中最简单的,它的格式和打印的..答案对于OP来说是正确的。 (5认同)
  • 这不是答案 (3认同)

Mat*_*eds 31

Debug特性打印出的名称Enum变型.

如果您需要格式化输出,可以实现DisplayEnum像这样:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 在你的答案中需要取消引用“self”吗? (2认同)

nja*_*jam 28

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

#[derive(strum_macros::Display)]
enum Suit {
    Heart,
    Diamond,
    Spade,
    Club,
}

fn main() {
    let s: Suit = Suit::Heart;
    println!("{}", s); // Prints "Heart"
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然它没有很多票(目前),但这可能就是您想要的,因为为任何枚举提供简单的显示支持是最少的工作。 (4认同)

rau*_*fer 7

结合两个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);
}
Run Code Online (Sandbox Code Playgroud)