我对Rust 还不熟悉,我试图理解什么时候应该使用"展开"和"预期".

下面是一个示例代码:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = args.get(1).unwrap();
    println!("query from unwrawp: {}", query);

    let query = args.get(1).expect("insufficient arguments");
    println!("query from expect: {}", query);

    //$ cargo run hello
    //OUTPUT:
    //query from expect: hello
    //query from unwrawp: hello

}

Only difference I observed is there's a custom panic message in expect.
Are these two interchangeable or are there any special scenarios where we should use one over the other?

推荐答案

Rust没有function overloading,所以应该有一种方法来声明"unwrap with a message",即expect.

  1. expect==unwrap,带消息
  2. expect_err==unwrap_err,带消息

关于"unwrap vs expect"Rust Book (Ch 9)的使用场景:

使用expect而不是unwrap,并提供良好的错误消息,可以传达您的意图,使追踪panic 源变得更容易.

Rust相关问答推荐

Rust kill std::processs::child

什么样的 struct 可以避免使用RefCell?

如何在原始字符串中转义";#和#";

为什么实例方法可以像Rust中的静态方法一样被调用?

try 创建随机数以常量

Rust 中什么时候可以返回函数生成的字符串切片&str?

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

通过写入 std::io::stdout() 输出不可见

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

需要一个有序向量来进行 struct 初始化

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

borrow 匹配手臂内部的可变

如何在 Rust 中将 Vec> 转换为 Vec>?

第 7.4 章片段中如何定义 `thread_rng`

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

深度嵌套枚举的清洁匹配臂

编写 TOML 文件以反序列化为 struct 中的枚举

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

如何在 Rust 的内置函数上实现特征?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?