Rust 命令行参数解析指南

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() 打印命令行参数的一个示例:

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.mzph.cn/web/5518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAGFlow:安装与体验

服务器需要有docker,或者直接访问官方提供的demo: https://demo.ragflow.io/ docker-compose安装 需要确保 vm.max_map_count 不小于 262144 【更多】:sysctl -w vm.max_map_count=262144 克隆仓库:$ git clone https://github.com/infiniflow/ragflow.git 进入 doc…

【介绍下Unity编辑器扩展】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【17】JAVASE-集合专题【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

【Java】java实现文件上传和下载(上传到指定路径/数据库/minio)

目录 上传到指定路径 一、代码层级结构 二、文件上传接口 三、使用postman进行测试&#xff1b; MultipartFile接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFile part接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFileByRequest 接收前端传递…

【webrtc】MessageHandler 2: 基于线程的消息处理:以PeerConnectionClient为例

PeerConnectionClient 前一篇 nullaudiopoller 并么有场景线程,而是就是在当前线程直接执行的, PeerConnectionClient 作为一个独立的客户端,默认的是主线程。 PeerConnectionClient 同时维护客户端的信令状态,并且通过OnMessage实现MessageHandler 消息处理。 目前只处理一…

常见公式的几何解释

本文旨在深入探讨常见数学公式的几何意义&#xff0c;通过直观的图形和解释&#xff0c;帮助读者更好地理解并掌握这些公式的本质。文章首先概述了公式与几何图形之间的紧密联系&#xff0c;然后选取了几个典型的数学公式&#xff0c;进行详细解析。每个公式都将配以相应的几何…

怎么做视频二维码更方便?在线一键生成视频活码二维码

现在经常会发现很多的二维码可以用来展示视频内容&#xff0c;通过这种方式来实现视频的快速分享与传播。二维码是一种成本低传播快的内容传播方式&#xff0c;很多的内容都可以通过生成二维码的方式来分享给其他人&#xff0c;可以同时扫描相同的二维码来获取内容&#xff0c;…

在线听歌播放器 梨花带雨网页音乐播放器 网页音乐在线听 源码

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 下 载 地 址 &#xff1a; runruncode.com/php/19749.html 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&am…

《半小时漫画论语》读书笔记

站在几年前看现在的我&#xff0c;感觉多了几分犹豫、内耗&#xff0c;少了几分勇敢。 今天重新读下论语&#xff0c;矫正一下人生态度。 一、论语是什么 论语&#xff0c;主要记载了孔子和他弟子们日常说的话、做的事。 孔子&#xff0c;读书人心中的圣人&#xff0c;中国历…

开关电源输入EMI滤波器设计与仿真

目录 开关电源输入EMI滤波器设计与仿真 摘要 1 .开关电源特点及噪声产生原因

气象数据nc数据矢量化处理解析及可视化

气象数据可视化是将气象学领域中复杂的数据集转化为图形或图像的过程&#xff0c;以直观展示天气现象、气候模式、趋势和预报结果。气象数据的可视化技术广泛应用于科学研究、气象预报、航空、航海、农业生产、灾害预警系统、城市规划、公众服务等领域。以下是一些关键的气象数…

SpringCloud 学习笔记 —— 一、背景

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建&#xff1a;服务提供者-CSDN博客 …

C++证道之路第十五章友元、异常和其他

友元 友元函数&#xff1a; 友元函数不是类的成员函数&#xff0c;但能够访问类的私有&#xff08;private&#xff09;成员和保护&#xff08;protected&#xff09;成员。友元函数定义在类的外部&#xff0c;但在类的定义中通过friend关键字声明。友元函数可以是普通函数&a…

如何在Spring Boot中配置数据库密码加密

如何在Spring Boot中配置数据库密码加密&#xff1f; alibaba/druid Wiki GitHub 使用ConfigFilter alibaba/druid Wiki GitHub 巧用Druid数据源实现数据库连接密码的加密解密功能 import com.alibaba.druid.filter.config.ConfigTools;public class Testttt {public stat…

Android4.4真机移植过程笔记(二)

5、盘符挂载 先定义overlay机制路径&#xff0c;后面storage_list.xml要用到&#xff1a; 在路径&#xff1a; rk3188_android4.4.1/device/rockchip/OK1000/overlay/frameworks/base/core/res/res/xml/定义好&#xff0c;注意名字要和emmc的代码片段&#xff08;往下面看&am…

maven 知识目录

maven 知识相关目录主要参考尚硅谷 赵伟风老师的视屏&#xff0c;参考链接为 http://www.atguigu.com/video/271/ 1、基础知识 maven入门和进阶 链接&#xff1a;https://blog.csdn.net/m0_59748326/article/details/138368887?spm1001.2014.3001.5501

Q1营收稳健增长,云从科技如何在“百模大战”的险中求稳?

自从迈入大模型时代&#xff0c;AI行业可谓“一天一个样”。越来越多的企业涌现&#xff0c;舆论热议从未断绝。 但就像所有技术必须经历的那些考验&#xff0c;在现实尺度下&#xff0c;AI顺利走进商业化世界&#xff0c;仍然是少部分玩家掌握的稀缺能力。个中原因不尽相同&a…

python 同一路径下把多个Excel文件合并成一个Excel文件的不同sheet表

import pandas as pd import os# 设定工作目录&#xff08;如果所有Excel文件都在这个目录下&#xff09; working_directory E:\\Program Files\\DM\\Chuwentaizahng\\合并# 获取工作目录下所有的Excel文件 excel_files [f for f in os.listdir(working_directory) if f.end…

Flutter笔记:Widgets Easier组件库(4)使用按钮组

Flutter笔记 Widgets Easier组件库&#xff08;4&#xff09;&#xff1a;使用按钮组 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…

JavaEE 初阶篇-深入了解网络原理中传输层的端口号与 UDP 协议报文格式

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 端口号概述 1.1 端口号的作用 1.2 端口号不能重复被多个进程绑定 2.0 传输层协议 - UDP 2.1 UDP 的特性 2.2 UDP 的报文格式 1.0 端口号概述 端口号是计算机网络中…