我正在Rust中实现FizzBuzz。我从最简单的版本转到使用枚举,但无法解决。我已经读过枚举非常有效,所以我尝试充分利用它们。
这是我的实现方式:
if constexpr
我有2个问题:
如何在if constexpr
块中使用实际枚举的名称?
在Java中,我只能使用use std::fmt;
fn main() {
for i in 1..100 {
println!("{}", fizzbuzz(i))
}
}
fn fizzbuzz(value: i32) -> Answer {
use crate::Answer::*;
return match (value % 3, value % 5) {
(0, 0) => FizzBuzz,
(0, _) => Fizz,
(_, 0) => Buzz,
(_, _) => Nothing(value),
};
}
enum Answer {
FizzBuzz,
Fizz,
Buzz,
Nothing(i32),
}
impl fmt::Display for Answer {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use crate::Answer::*;
match self {
FizzBuzz => write!(f, "FizzBuzz"),
Fizz => write!(f, "Fizz"),
Buzz => write!(f, "Buzz"),
Nothing() => write!(f, "number passed to NoBuzz"),
}
}
}
,它会打印
match self
-Rust中有可能吗?
是否可以打印我在FizzBuzz.name()
中传递给"FizzBuzz"
的{{1}}
功能?
答案 0 :(得分:1)
您可以使用#[derive(Debug)]
导出用于打印目的的可打印表示形式 。这样一来,您可以使用println!("{:?}", self)
示例:
#[derive(Debug)]
enum Answer {
FizzBuzz,
Fizz,
Buzz,
Nothing(i32),
}
match self {
Nothing(_) -> /* ... */,
other -> println!("{:?}", other),
}
但是,自己编写一个Display
实例更为合适。您必须自己进行翻译(Fizz -> "Fizz"
等),但是它将在一个集中的位置,您可以像以前一样将其传递给格式化程序。
要从Nothing
中获取值,只需在其上进行模式匹配并为其命名。代替
Nothing(_) => // Do something generic
考虑
Nothing(n) => // Do something that involves the number n