首页 > 解决方案 > 打印选项解包变量后变量给出错误

问题描述

如果我尝试解开一个变量,然后尝试打印该变量,它会给出错误

borrow of moved value: `var`

rustc 的完整输出

error[E0382]: borrow of moved value: `var`
   --> test.rs:6:24
    |
3   |     let var: Option<String> = Some("Hello World".to_string());
    |         --- move occurs because `var` has type `Option<String>`, which does not implement the `Copy` trait
4   |     println!("var: {:?}", var);
5   |     println!("value: {}", var.unwrap());
    |                               -------- `var` moved due to this method call
6   |     println!("var: {:?}", var);
    |                           ^^^ value borrowed here after move
    |
note: this function takes ownership of the receiver `self`, which moves `var`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.

我的代码:

fn main() {
    // Doesn't work on String type
    let var: Option<String> = Some("Hello World".to_string());
    println!("var: {:?}", var);
    println!("value: {}", var.unwrap());
    println!("var: {:?}", var);

    // Works on i32 type
    // let var: Option<i32> = Some(5);
    // println!("var: {:?}", var);
    // println!("value: {}", var.unwrap());
    // println!("var: {:?}", var);
}

顺便说一句,我刚开始学习 rust,所以我对 rust 了解不多。

标签: rust

解决方案


问题是拥有以下unwrap所有权self

fn unwrap(self) -> T;

为了避免这种情况,你可以as_ref先打电话,这会给你一个Option<&T>- 借用:

// fn as_ref(&self) -> Option<&T>;

println!("var: {:?}", var);
println!("value: {}", var.as_ref().unwrap());
println!("var: {:?}", var);

Option有很多这样的实用方法,例如as_mut, as_deref, map, 和cloned. 我鼓励您查看文档以获得完整的参考,它们非常方便。


推荐阅读