Rust 命令行参数解析指南

ops/2024/10/18 16:53:35/

0x00 前言

通过 Rust 的 Governance 可以看到 Rust 的通过三种方式管理社区:

  • RFC process
  • Teams
  • Working Groups

在 Working Groups 中我发现竟然有一个叫 Command-line interfaces (CLI) working group 的工作组(简称 WG-CLI)。很明显,如果 Rust 对于 CLI 类的应用程序是非常重视的,从编译体积/执行效率/安全性 上都可以作为新生 CLI 类应用开发的首选语言。CLI 类应用主要的输入方式是命令行参数,本文主要讨论 Rust 中处理命令行参数的几种常规方法。

0x01 std::env::args()

Rust 为了适配更多的场景,很多机制都只提供一个极简的可任意扩展的接口,例如支持异步机制时只提供了 Future 这个无法独立运行的概念,而需要引入自己维护的一个第三方 crate 才能使用 async/await 语义。在命令行处理上也是如此,通过 std 只能使用 env::args() 来获取命令行参数,剩下的流程都靠开发者自己实现。
下面是使用 std::env::args() 打印命令行参数的一个示例:

rust">use std::{env, process};fn print_args(args: impl Iterator<Item = String>) -> Result<(), &'static str> {for argument in args {println!("{}", argument);}Ok(())
}fn main() {print_args(env::args()).unwrap_or_else(|err| {eprintln!("Problem parsing arguments: {}", err);process::exit(1);});
}

显然对于简单的命令行参数,这种方式可以在不引入第三方 crate 的情况下实现功能,但是对于一些需要处理复杂输入参数的场景确实比较吃力,剩下的交给 Rust 生态,接下来我们通过一些比较流行的命令行处理 crate 展开学习。

0x02 3rd-party

有一个非常有意思的 Repo –– argparse-rosetta-rs 对比了几种常见命令行参数处理 crate。

NameStyleNotes
arghderive
bpafCombinatoric or derive
clap_lexImperativeNo help generation
clapBuilder or deriveColor, suggested fixes, completions
gumdropderive
lexoptImperativeNo help generation
pico-argsImperativeNo help generation
xflagsproc-macro

按照调用风格可以分为两类:

  • 命令式 (Imperative)
  • 声明式 (Declarative)

命令式方式通常比较直观,将参数解析结构化成支持 iterate and match 的形式。声明式的方式主要有两种,一种是通过链式 Builder 方式声明一个 Command,然后去 match 输入的命令行参数;另一种是通过 Rust 的 derive 机制声明结构体后进行 parse。具体使用方式可以参考上表中每个 crate 文档中的示例。

0x03 结论

Rust 命令行参数 crate 中最流行的 clap 的主要维护者 Ed Page 同时也是 WG-CLI 的 team leader,这种生态模式让 Rust 的生态更加多样性的同时也更具有实践价值,我们从命令行参数处理这一个点来多层次观察 Rust 的语言发展策略,生态构建方式,可以看出,Rust 吸取了前辈的一些成功和失败经验,正在成为一个生命力强劲的编程语言。

Reference

  • https://github.com/rosetta-rs/argparse-rosetta-rs/blob/main/docs/tradeoffs.md
  • https://doc.rust-lang.org/std/env/fn.args.html

http://www.ppmy.cn/ops/27371.html

相关文章

BCSP-X 2024第一轮报名开始啦!

BCSP-X 2024第一轮报名开始啦! 2024北京中小学信息学能力测评活动(BCSP-X 2024)第一轮即将开始,4月20日起开始报名。本次活动包括基础知识测评和编程能力测评两部分,不收取任何费用。 重要时间节点 基础知识测评报名:4月20日-5月12日17:00基础知识测评:5月19日9:30-11:30基础…

张鸣独到解读:规矩与自信的政治影响

在当今多变的政治舞台上&#xff0c;学者张鸣教授以其犀利而深邃的视角&#xff0c;对规矩与自信提出了新的解读。他的言论不仅引发了公众的广泛关注&#xff0c;也为我们提供了思考社会政治问题的一个新的角度。张教授指出&#xff0c;规矩并非僵化的教条&#xff0c;而应是动…

iNav开源代码之研读分析篇章目录梳理

iNav开源代码之研读分析篇章目录梳理 1. 源由2. 基础篇章3. 代码篇章4. 场景篇章5. 异常篇章6. 总结7. 参考资料 1. 源由 之前有介绍过Betaflight/PX4/ArduPilot&#xff0c;虽然iNav代码和Betaflight类似&#xff0c;但是针对iNav系列的没有整理过一个总的目录。 今天打算也…

2.9 VM17虚拟机安装Centos系统和docker

VM17虚拟机安装Centos系统和docker 目录一、windows11安装VMware Workstation17虚拟机二、使用VM17虚拟机安装Centos(Linux)系统1. 镜像下载三、Centos系统安装docker1. 终端切换root权限2. 卸载旧版本的 Docker(新系统或者没安装过docker就跳过)3. 安装 Docker4. 配置 Docke…

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

使用docker创建rocketMQ主从结构,使用

1、 创建目录 mkdir -p /docker/rocketmq/logs/nameserver-a mkdir -p /docker/rocketmq/logs/nameserver-b mkdir -p /docker/rocketmq/logs/broker-a mkdir -p /docker/rocketmq/logs/broker-b mkdir -p /docker/rocketmq/store/broker-a mkdir -p /docker/rocketmq/store/b…

Java_从入门到JavaEE_08

一、Eclipse开发工具的介绍 Eclipse工具简绍 Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具。 下载与安装 下载&#xff1a; Ecli…

持续总结中!2024年面试必问 100 道 Java基础面试题(二十一)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;二十&#xff09;-CSDN博客 四十一、switch是否能用在String上&#xff1f; 在Java中&#xff0c;switch语句可以使用String类型的变量。从Java 7开始&#xff0c;switch语句的…