枚举的返回值

时间:2019-01-06 20:06:26

标签: rust

我正在Rust中实现FizzBu​​zz。我从最简单的版本转到使用枚举,但无法解决。我已经读过枚举非常有效,所以我尝试充分利用它们。

这是我的实现方式:

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}} 功能?

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