12一个IO项目:构建命令行程序

当所需函数嵌套了多于一层模块时,通常将父模块引入作用域,而不是其自身。这便于我们利用 std::env 中的其他函数。这比增加了 use std::env::args; 后仅仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。

args 函数和无效的 Unicode

注意 std::env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效 Unicode 字符的参数,使用 std::env::args_os 代替。

然而 collect 是一个经常需要注明类型的函数,因为 Rust 不能推断出你想要什么类型的集合。

二进制项目的关注分离

main 函数进行二进制程序的关注分析的指导性过程。

  • 将程序拆分成 main.rslib.rs 并将程序的逻辑放入 lib.rs 中;
  • 当命令行解析逻辑比较小时,可以保留在 main.rs 中;
  • 当命令行解析开始变得复杂时,也同样将其从 main.rs 提取到 lib.rs 中。

经过这些过程之后,保留在 main 函数中的责任应该被限制为:

  • 使用参数值调用命令行解析逻辑;

  • 设置任何其他的配置;

  • 调用 lib.rs 中的 run 函数;

  • 如果 run 返回错误,则处理这个错误;

  • main.rs 处理程序运行,

    • 不能直接测试 main 函数,所以将所有需要测试的都放进 lib.rs 中
  • lib.rs 处理所有的真正的任务逻辑。

Rust 中 默认项目是私有的,这个私有范围在同一个 mod 模块中,如果没有明确标注 mod ,则一个文件就是一个 mod

使用 clone 的权衡取舍

由于其运行时消耗,许多 Rustacean 之间有一个趋势是倾向于避免使用 clone 来解决所有权问题。在关于迭代器的第十三章中,我们将会学习如何更有效率的处理这种情况。

Result<T,E> 中的 unwrap_or_else 方法

  • 通过传递一个闭包(closure)作为参数,可以自定义非 panic! 的错误处理;
  • 当 Result 是 Ok 时,这个方法的行为类似于 unwrap,返回 Ok 内部封装的值;
  • 如果是 Err ,该方法会调用传进去的闭包。

trait 对象

第十七章 会涉及 trait 对象。

std::error::Error引入作用域,同时使用Box<dyn Error> trait 对象,意味着函数会返回实现了Error trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同的错误返回值的灵活性。这也就是 dyn ,它是动态(dynamic)的缩写。

  • 这比在返回值上使用 impl trait 语法灵活多了。

当使用 Result<T,E> 处理没有返回值的函数的错误时,

  • 没有错误时一般使用 Ok(()),() 即unit类型,表示没有返回值
  • 错误就使用 Err 将错误包装一下返回。

处理环境变量

将错误打印到标准错误中

使用 eprintln!

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信