【开发总结】Rust的命令行库clap

偶然了解到Rust中有命令行处理的相关库clap,可以很方便的解决程序员需要编写命令行程序时的命令行输入参数问题。
在CSDN中找到了一篇文章进行学习,将一些感想记录如下:
首先该文章的运行环境是cargo,首先需要通过

cargo new "项目名"

指令创建一个新的项目。
作者在第一段给出了一个官方文档中的例子,却并没有介绍程序功能和如何运行,查阅GPT后发现这段程序可以根据用户输入的名字和次数输出相应的打招呼内容。
运行指令为

cargo run -- -n test -c 5

同时还支持完全的命令方式调用(这也是clap的默认提示,如果用户输入错误的话会以此形式提示)

cargo run -- --name test --count 5

程序将会输出5次Hello test!

关注到上述例子中有一个为default_value_t的形参,通过测试发现,如果是系统默认的OsStr类型,也即字符串,可以通过default_value指定,否则会报错:

error[E0308]: mismatched types
 --> src/main.rs:8:42
  |
8 |     #[arg(short, long, default_value_t = "World")] // 设置 name 字段的默认值     ...
  |                                          ^^^^^^^- help: try using a conversion method: `.to_string()`
  |                                          |
  |                                          expected `String`, found `&str`
9 |     name: String,
  |           ------ expected due to this

需要把str转成String,但是在形参部分却不支持.to_string()转换方法,又无法在结构体内部定义变量,查阅GPT发现,可以使用default_value类型直接处理此种情况,因为此时需要传入的是字符串(下一部分将会看到为什么只有字符串才能如此处理)
如果将default_value_t = 1改为default_value = 1,将会报错如下:

error[E0277]: the trait bound `clap::builder::OsStr: From<{integer}>` is not satisfied
    --> src/main.rs:12:40
     |
12   |     #[arg(short, long, default_value = 1)]
     |                        -------------   ^ the trait `From<{integer}>` is not implemented for `clap::builder::OsStr`
     |                        |
     |                        required by a bound introduced by this call
     |
     = help: the following other types implement trait `From<T>`:
               <clap::builder::OsStr as From<Str>>
               <clap::builder::OsStr as From<&clap::builder::OsStr>>
               <clap::builder::OsStr as From<&Str>>
               <clap::builder::OsStr as From<&&'static std::ffi::OsStr>>
               <clap::builder::OsStr as From<&&'static str>>
               <clap::builder::OsStr as From<&'static std::ffi::OsStr>>
               <clap::builder::OsStr as From<&'static str>>
     = note: required for `{integer}` to implement `Into<clap::builder::OsStr>`
     = note: required for `{integer}` to implement `IntoResettable<clap::builder::OsStr>`

可以看到,default_value默认支持的是OsStr类型的,也即字符串,因此需要将其改为default_value = "1"才能通过编译。

最后一段例子3 自定义验证逻辑中有两个->接中文注释的部分,此部分为注释,应该以//开头。

最后一个例子是没有指令flag的short 和long name的,所以只能直接输入参数,无法通过–port 8080的方式调用。

相关推荐

  1. 开发总结Rust命令clap

    2024-04-01 02:42:01       21 阅读
  2. rust clap命令解析)

    2024-04-01 02:42:01       9 阅读
  3. rust从0开始写项目-06-如何接受命令参数clap-01

    2024-04-01 02:42:01       33 阅读
  4. Rust 命令参数解析指南

    2024-04-01 02:42:01       13 阅读
  5. 前端开发需掌握linux命令

    2024-04-01 02:42:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 02:42:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 02:42:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 02:42:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 02:42:01       20 阅读

热门阅读

  1. 练气第四天

    2024-04-01 02:42:01       16 阅读
  2. Python提取文本文档符合条件的某列

    2024-04-01 02:42:01       13 阅读
  3. 分布式算法 - ZAB算法

    2024-04-01 02:42:01       11 阅读
  4. 深度优先搜索(DFS)算法深入探索与实践

    2024-04-01 02:42:01       15 阅读
  5. [内部类与常见API]String类

    2024-04-01 02:42:01       15 阅读
  6. 如何让div中滚动条一直保持在最下方

    2024-04-01 02:42:01       17 阅读
  7. 烂笔头,记录一年遗忘

    2024-04-01 02:42:01       16 阅读
  8. 【python】《流畅的python》读书笔记之第1-2章

    2024-04-01 02:42:01       14 阅读
  9. Redis 过期删除策略和内存淘汰策略

    2024-04-01 02:42:01       17 阅读