我有这个枚举:
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum TheAge {
Adult,
Age(u8)
}
还有 cli 结构
#[derive(Parser)]
#[command(author, version, about, long_about)]
pub struct Cli {
#[arg(short, long, value_enum)]
pub age: TheAge
}
此操作失败并出现以下错误:
error: `#[derive(ValueEnum)]` only supports unit variants. Non-unit variants must be skipped
当我从枚举中删除
Age(u8)
时,它会编译。
关于如何使用非单位变体的枚举有什么技巧吗?
ValueEnum
不支持非单位变体,因此您无法导出它。
相反,您可以为该结构实现 From<&str>
,它将起作用:
use clap::Parser;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum TheAge {
Adult,
Age(u8)
}
impl From<&str> for TheAge {
fn from(v: &str) -> TheAge {
v.parse::<u8>().map_or(TheAge::Adult, |a| if a >= 18 { TheAge::Adult } else { TheAge::Age(a) })
}
}