【发布时间】:2021-09-22 23:38:31
【问题描述】:
想知道是否有将Enum 转换为&str 并返回的“正确”方式。
我要解决的问题:
在clap crate 中,args/子命令由&strs 定义和标识。 (我假设没有完全利用类型检查器。)我想将 Command Enum 传递给我的应用程序,而不是 &str ,这将由类型检查器和也让我免于在各处输入(打字?)字符串。
这是我通过搜索 StackOverflow 和 std 得出的:
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Command {
EatCake,
MakeCake,
}
impl FromStr for Command {
type Err = ();
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s.to_ascii_lowercase().as_str() {
"eat-cake" => Ok(Self::EatCake),
"make-cake" => Ok(Self::MakeCake),
_ => Err(()),
}
}
}
impl<'a> From<Command> for &'a str {
fn from(c: Command) -> Self {
match c {
Command::EatCake => "eat-cake",
Command::MakeCake => "make-cake",
}
}
}
fn main() {
let command_from_str: Command = "eat-cake".to_owned().parse().unwrap();
let str_from_command: &str = command_from_str.into();
assert_eq!(command_from_str, Command::EatCake);
assert_eq!(str_from_command, "eat-cake");
}
这是我在clap 中运行的内容的精简版。
let matches = App::new("cake")
.setting(AppSettings::SubcommandRequiredElseHelp)
// ...
.subcommand(
SubCommand::with_name(Command::MakeCake.into())
// ...
)
.subcommand(
SubCommand::with_name(Command::EatCake.into())
// ...
)
.get_matches();
它似乎有效,但我不确定我是否遗漏了什么/更大的图景。
相关:
- How to use an internal library Enum for Clap Args
- How do I return an error within match statement while implementing from_str in rust?
谢谢!
【问题讨论】:
-
FWIW,structopt crate 正好处理这种情况。但无论如何,这是一个好问题!不,我认为你没有遗漏任何东西。
-
是的!我看起来超级酷,我还记得偶然发现
claps beta documentation 似乎使用了类似的语法......但是,是的,只是好奇其他人如何在这个特定情况之外处理这个问题。 @纳撒尼尔福特 -
serializable_enum或enum_from_str板条箱可以在这里提供帮助。 -
其实有a lot of crates可以做到的。
-
@Jmb 谢谢!是的,我还不够精通 rust,不知道什么时候拿一个箱子,或者什么时候只用
std自己实现它。