04|get hands dirty:来写个实用的CLI小工具

201 阅读1分钟

正式开始

链接

HTTPPie 命令行工具

统计代码行数 tokei

本节代码

Golang的CLI解析库 cobra

Python的CLI解析库 click

优化Rust二进制大小

本节代码

新鲜知识点

  1. cargo build --release,编译出 release 版本

常用库推荐

  1. 命令行解析工具 clap
  2. HTTP 客户端 reqwest
  3. 终端格式化输出 colored
  4. 语法高亮库 syntect
  5. 错误处理:anyhow
  6. 格式化JSON:jsonxf
  7. 处理MIME类型:mimi
  8. 异步处理:tokio

精选问答

  1. 以下代码没有实现 trait impl for String, 为啥可以call blue on String type呢?

    format!("{:?} {}", resp.version(), resp.status()).blue();

    a. Colorize trait 的定义中,方法 consume 的都是 self,而非 &self。所以当 impl Colorize for &str 时,self = &str

    b. 在调用方法时,编译器会先看数据结构是否有对应的方法,如果有,按照方法的 signature,传 self / &self / &mut self。

    c. 如果没有,再看引入的 trait 是否有对应的方法,必要时会根据 self 的类型做 auto Deref。所以这里编译器可以找到 blue(),因为它第一个参数 self = &str,String 可以 Deref 到 &str,所以可以调用。

    d. 演示代码

  2. Rust里面的宏跟Python里面装饰器的区别

    a. 宏可以操作并修改代码的 AST,装饰器只能对代码简单包装,无法改动 AST