有没有办法打印枚举值?
Is there a way to print enum values?
是否有一种简单的方法来格式化和打印枚举值?我预计他们会有 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`
您可以导出 std::format::Debug
的实现:
#[derive(Debug)]
enum Suit {
Heart,
Diamond,
Spade,
Club
}
fn main() {
let s = Suit::Heart;
println!("{:?}", s);
}
无法推导出 Display
,因为 Display
旨在向人类展示,编译器无法自动决定适合该情况的样式。 Debug
面向程序员,因此可以自动生成内部公开视图。
Debug
特征打印出 Enum
变体的名称。
如果您需要格式化输出,您可以像这样为您的 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);
}
将两个 and 的答案结合起来以获得更简洁的版本:
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);
}
如果您想为枚举变体自动生成 Display
实现,您可能需要使用 strum 包装箱:
#[derive(strum_macros::Display)]
enum Suit {
Heart,
Diamond,
Spade,
Club,
}
fn main() {
let s: Suit = Suit::Heart;
println!("{}", s); // Prints "Heart"
}
是否有一种简单的方法来格式化和打印枚举值?我预计他们会有 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`
您可以导出 std::format::Debug
的实现:
#[derive(Debug)]
enum Suit {
Heart,
Diamond,
Spade,
Club
}
fn main() {
let s = Suit::Heart;
println!("{:?}", s);
}
无法推导出 Display
,因为 Display
旨在向人类展示,编译器无法自动决定适合该情况的样式。 Debug
面向程序员,因此可以自动生成内部公开视图。
Debug
特征打印出 Enum
变体的名称。
如果您需要格式化输出,您可以像这样为您的 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);
}
将两个
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);
}
如果您想为枚举变体自动生成 Display
实现,您可能需要使用 strum 包装箱:
#[derive(strum_macros::Display)]
enum Suit {
Heart,
Diamond,
Spade,
Club,
}
fn main() {
let s: Suit = Suit::Heart;
println!("{}", s); // Prints "Heart"
}