Rust命令行参数解析:使用clap

news2024/10/18 20:09:06

Rust命令行参数

Rust程序的命令行参数,可以通过std::env::args_os函数取得。

std::env::args_os函数的原型为:

pub fn args_os() -> ArgsOs

其中,ArgsOs是一个迭代器,每一个迭代值都是一个OSString。

我们知道,OSString可能包含非法的UTF-8字符。如果要只接受合法的UTF-8字符,在出现非法UTF-8字符的情况下崩溃程序,可以使用std::env::args函数。

std::env::args函数的原型与args_os类似,只是返回值是Args,即String的迭代器。

pub fn args() -> Args

解析命令行参数

我们可以取得std::env::args_os或者std::env::args函数的返回值之后,手动解析。

如:

use std::env;

for argument in env::args_os() {
    println!("{argument:?}");
}

就把每一个命令行参数打印了出来。

旧式clap解析

手动解析命令行参数比较麻烦,我们可以使用成熟的crate,比如clap。

使用cargo构建的Rust程序,可以通过

cargo add clap

来添加clap依赖。

之后,就可以在Rust程序中,使用clap来解析命令行参数了。

比较早期的clap,比如2.0.0版本,是通过clap::App以及clap::Arg来解析。

如《Rust实战》中这段样例代码:

use regex::Regex; 
use clap::{App,Arg}; ⇽--- 导入clap::App和clap::Arg对象到当前的局部作用域。 
 
fn main() { 
    let args = App::new("grep-lite") ⇽--- 逐步构建命令行参数解析器。每个参数对应一个Arg。在本例中,我们只需要一个参数。 
    .version("0.1") 
    .about("searches for patterns") 
    .arg(Arg::with_name("pattern") 
    .help("The pattern to search for") 
    .takes_value(true) 
    .required(true)) 
    .get_matches(); 

    let pattern = args.value_of("pattern").unwrap(); ⇽--- 提取pattern参数。 
    let re = Regex::new(pattern).unwrap(); 
    ……
}

通过以上代码以及注释,可以大概了解到,使用clap 2 解析命令行参数的过程就是:

  1. 通过clap::App结构的new方法,生成一个App。
  2. 添加Arg,设置help、about等到App。
  3. 调用App的get_matches方法。
  4. 通过get_matches方法返回的ArgMatches结构的value_of方法,取得解析出来的参数值。

新版本clap解析,以4.5.20为例

如果使用的是比较新的clap,如4.5.20,则会发现已没有clap::App这个结构,取而代之的是clap::Command,而且clap::Arg的构造方法也有了变化。

4.5.20的clap中包含Arg、ArgGroup、ArgMatches、Command以及Id等结构,另外有arg、command、value_parser等宏,还有Args、CommandFactory、FromArgMatches、Parser、SubCommand、ValueEnum等特性。

如以下代码,可以生成一个Command之后调用get_matches取得解析出来的ArgMatches结构:

let m = Command::new("My Program")
    .author("Me, me@mail.com")
    .version("1.0.2")
    .about("Explains in brief what the program does")
    .arg(
        Arg::new("in_file")
    )
    .after_help("Longer explanation to appear after the options when \
                 displaying the help information from --help or -h")
    .get_matches();

值得一提的是,Command有一个subcommand函数,可以实现子命令解析的功能。

如:

fn main {
// 生成一个check的子命令
let _check_command = Command::new("check")
.arg(Arg::new("init")
    .long("init")
    .action(ArgAction::SetTrue)
    .help("init the database"),
    ))

// 生成一个hello的命令
let _command = Command::new("hello")
.version("0.0.1")
.arg(Arg::new("config-file") // 增加一个config-file的参数
    .short('c')
    .long("config-file")
    .required(false)
    .default_value("/etc/hello.cfg"))
.subcommand(_check_command); // 增加一个check的子命令

let _matches = _command.get_matches();
}

编译上述代码,得到hello。

使用./hello -V命令,则会得到:

./hello -V  
hello 0.0.1

使用./hello -h或者./hello --help命令,则会得到:

./hello --help  
Usage: hello [OPTIONS] [COMMAND]  
  
Commands:  
 check     
 help   Print this message or the help of the given subcommand(s)  
  
Options:  
 -c, --config-file <config-file>  [default: /etc/hello.cfg]  
 -h, --help                 Print help  
 -V, --version              Print version

我们看到,在Commands里面,有一个check命令以及help命令。

我们使用./hello check --help命令,则会看到:

./hello check --help  
Usage: hello check [OPTIONS]  
  
Options:  
     --init               init the check database    
 -h, --help               Print help

即,我们有了一个子命令check,还接受子命令参数–init以及-h、–help。

取得子命令参数

我们可以通过clap::ArgMatches的subcommand函数,来取得子命令的参数。

ArgMatches的subcommand的原型为:

pub fn subcommand(&self) -> Option<(&str, &ArgMatches)>

所以,我们可以通过subcommand的结果,取得子命令的值,以及子命令的参数。

如:

 let app_m = Command::new("git")
     .subcommand(Command::new("clone"))
     .subcommand(Command::new("push"))
     .subcommand(Command::new("commit"))
     .get_matches();

match app_m.subcommand() {
    Some(("clone",  sub_m)) => {}, // clone was used
    Some(("push",   sub_m)) => {}, // push was used
    Some(("commit", sub_m)) => {}, // commit was used
    _                       => {}, // Either no subcommand or one not tested for...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217987.html

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

相关文章

python爬取themoviedb电影网站信息

python爬取themoviedb电影网站信息 一、寻找数据接口二、解析主页数据,获取详情页url三、向详情页url发送请求、获取并解析数据四、完整代码一、寻找数据接口 打开网站首页,F12打开开发者工具,刷新页面。 向下滑动页面,点击页面上的“Load More”图标。 寻找到数据接口,…

掘金2.计算位置 x 到 y 的最少步数(简单01)

public class Main {public static int solution(int xPosition, int yPosition) {int diff (yPosition - xPosition);// 计算差值if(diff < 0)diff * -1;int steps 0; // 初始化步数int begin 0;// 初始化当前位置int step 1;//初始化步长// 循环直到到达目标位置while…

DSVPN简介与应用

目录 简介 DSVPN 封装模式 Nomal&#xff08;动态&#xff09;方式建立DSVPN 一、配置缺省包过滤 二、划分区域&#xff08;以总部为例&#xff09; 三、配置IP地址&#xff08;以R1为例&#xff09; 四、配置DSVPN 简介 DSVPN DSVPN&#xff08;Dynamic Secure Vir…

一种3D打印跑车模型LED安全夜灯

我学习入门单片机及3Dmax的副产品&#xff0c;小玩意。MCU用8脚的就好&#xff0c;多脚功能复用&#xff0c;涉及长短按中断、ADC、掉电唤醒及LED切换控制&#xff0c;硬件的充放电监控及光控等等麻雀虽小五脏俱全。发使用指南不是广告&#xff0c;感觉这样才能毫无遗漏的说明其…

动态规划(1)斐波那契数列模型

动态规划算法流程&#xff1a; 1、状态表示&#xff1a; 指的是dp&#xff08;dynamic programming&#xff09;表里面的值所表示的含义 如何得出&#xff1a;1、题目要求 2、经验题目要求 3、分析问题的过程中发现重复子问题 2、状态转移方程 dp[i]等于什么 3、初始化 保证…

RAG拉满-上下文embedding与大模型cache

无论怎么选择RAG的切分方案&#xff0c;仍然切分不准确。 最近&#xff0c;anthropics给出了补充上下文的embedding的方案&#xff0c;RAG有了新的进展和突破。 从最基础的向量查询&#xff0c;到上下文embedding&#xff0c;再到rerank的测试准确度都有了明显的改善&#xf…

【无标题】如何在Costura.Fody生成时排除掉某些dll

有个场景需要排除掉某些dll让他不要打包到exe中,这样做,修改FodyWeavers.xml

配合工具,快速学习与体验electron增量更新

有任何问题&#xff0c;都可以私信博主&#xff0c;共同探讨学习。 正文开始 前言一、如何使用源码1.1 下载代码1.2 下载资源1.3 运行项目 二、如何使用工具2.1 打包新版本更新包2.2 创建nginx文件服务器2.3 在文件服务器保存软件更新包 三、如何测试更新3.1本地运行低版本3.2 …

九、PESocket通信

知识点&#xff1a;高并发 1、下载PESocket 地址&#xff1a;PlaneZhong/PESocket: A C# Network Library. (github.com) 2、示例代码 发过去一个Hello&#xff0c;返回一个hello 当一个客户端关闭了&#xff0c;会出现一个提示 当一个客户端开启&#xff0c;会显示已连接 3…

运放类公式计算

简介 很多运放的GAIN采用dB的方式表达放大倍数&#xff0c;然而我们有时候习惯使用电压的倍数代表运放放大关系&#xff0c;本章主要简单介绍dB与电压转换的关系。 例如某运放的放大倍数如下&#xff1a; G1G2GAIN(dB)0029.60119.110131116 以上放大倍数我们无法知道输入的信号…

有趣的在线可视化网站:探索神经网络与矩阵运算

有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算 文章目录 有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算一 TensorFlow Playground 神经网络二 Symbolab 的矩阵迹计算器三 Matrixmultiplication 可视化教学工具 本文推荐了几个非常有趣且实用的在线可视化…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 从简单开始一步一步讲&#xff0c; 1、sum( )over( ) 对所有行进行求和 2、sum(…

静态站点生成器哪家强?

有一种方法&#xff0c;让你写好文档后&#xff0c;快速地让同事、用户和合作伙伴看到&#xff0c;这就是静态站点生成器。 静态站点生成器是一种软件&#xff0c;用于创建不需要服务器端脚本的网站。这些网站由纯HTML文件组成&#xff0c;可能还包括CSS和JavaScript来增强功…

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据

目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet&#xff1f; 由于PHPExcel不再维护&#xff0c;所以建议使用PhpSpreadsheet来导出exlcel&#xff0c;但是PhpSpreadsheet由于是个新的类库&#xff0c;所以只支持PHP7.1及以上的版…

如何激活Windows server服务器

步骤&#xff1a; 一、用VMware虚拟机安装了Windows server服务器之后的状态 图1-1 查看Windows server2019 系统信息 图1-2 在桌面上查看个性化&#xff0c;提示系统未激活 二、激活的步骤&#xff1a; 1.找激活工具 图1-2 寻找激活工具并准备拖拽到虚拟服务器中 2.解压…

【服务器虚拟化是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

微信小程序使用MQTT连接阿里云

目录 一、新建项目和项目整体配置​ 二、MQTT 下载引入和配置连接​ 三、阿里云配置 1、创建产品及设备 2、数据进行云流转 四、创建 MQTT 连接​ 五、微信小程序配置 六、效果展示 1、微信小程序发送控制命令 2、LED台灯反馈LED状态 七、微信小程序项目完整代码 一…

不同晶圆厂的简单分析

以下是各类晶圆厂的投资情况、技术特点、应用场合、代表性公司以及建厂难度分析: 1. 先进逻辑芯片制造商: ->投资情况:台积电在美国亚利桑那州凤凰城的5nm半导体厂,三年总投资约120亿美元。 ->技术特点:使用最先进的制程技术,如5nm、3nm等,包括极紫外(EUV)光…

《太吾绘卷》风灵月影游戏辅助好不好用?《太吾绘卷》风灵月影游戏辅助功能 全解析

太吾绘卷风灵月影修改器可调整游戏多项数据&#xff0c;助力玩家轻松过关。启动游戏后&#xff0c;按数字键1开启无敌模式&#xff0c;数字键2锁定时间&#xff0c;数字键3实现物品不消耗&#xff0c;Ctrl数字键1则能获得无限银钱等功能&#xff0c;为玩家提供全方位的游戏辅助…

如何删除Maven

1.找到Maven安装路径 方法一&#xff1a; 可以直接在文件资源管理器里面选中“此电脑”然后右上角搜“apache-maven”&#xff0c;这个过程可能长达几分钟甚至更久 方法二&#xff1a; 这里推荐一个名叫“Everything”的软件&#xff0c;能够快速的查找到需要的文件 2.找到本…