#[derive(ValueEnum)]
不支持非unit变量,因此你可以得出。
如果你看一下所需物品,那就说明为什么:
impl ValueEnum for TheAge {
fn value_variants() -> & a [Self] { todo!() }
fn to_possible_value(&self) -> Option<PossibleValue> { todo!() }
}
<代码> 价值_variants
一切可能的论点价值都显示出来。
如果“所有可能的数值”包括每一条<代码>u8 (即使只有257个数值,它仍是一个幻觉。) 不可能笼统地产生所有类型的价值,因此,你可以打上“条码”(ValueEnum)]# [derive(ValueEnum)],在某些情况下,通过手法加以实施(例如,值为enum
,只有几种变量)。
相反,你可以实施<条码>From<&str>,用于这一构件。
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum TheAge {
Adult,
Age(u8)
}
const LEGAL_ADULT_AGE: u8 = 18;
impl From<&str> for TheAge {
fn from(v: &str) -> TheAge {
v.parse::<u8>().map_or(TheAge::Adult, |a| {
if a >= LEGAL_ADULT_AGE {
TheAge::Adult
} else {
TheAge::Age(a)
}
})
}
}
fn main() {
dbg!(Cli::parse_from(["", "--age", "18"]).age); // and above -> Adult
dbg!(Cli::parse_from(["", "--age", "17"]).age); // and below -> Age(17)
dbg!(Cli::parse_from(["", "--age", "anything_else"]).age); // -> Adult
}