1

当我有一个Option并且想要参考里面的东西或创建一些东西时,如果它是一个None我得到一个错误。

示例代码:

fn main() {
    let my_opt: Option<String> = None;

    let ref_to_thing = match my_opt {
        Some(ref t) => t,
        None => &"new thing created".to_owned(),
    };

    println!("{:?}", ref_to_thing);
}

操场

错误:

error[E0597]: borrowed value does not live long enough
  --> src/main.rs:6:18
   |
6  |         None => &"new thing created".to_owned(),
   |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
   |                  |                            |
   |                  |                            temporary value dropped here while still borrowed
   |                  temporary value does not live long enough
...
10 | }
   | - temporary value needs to live until here

基本上,创造的价值活得不够长。获取对 a 中的值的引用Some或创建一个值(如果它是 aNone并使用该引用)的最佳方法是什么?

4

3 回答 3

5

你也可以只写:

None => "new thing created"

通过这种调整,您的代码的初始变体将无需额外的变量绑定即可编译。

另一种选择也可以是:

let ref_to_thing = my_opt.unwrap_or("new thing created".to_string());
于 2018-08-12T04:10:23.430 回答
4

我发现的唯一方法是创建一个“虚拟变量”来保存创建的项目并赋予它生命周期:

fn main() {
    let my_opt: Option<String> = None;

    let value_holder;
    let ref_to_thing = match my_opt {
        Some(ref t) => t,
        None => {
            value_holder = "new thing created".to_owned();
            &value_holder
        }
    };

    println!("{:?}", ref_to_thing);
}

操场

于 2018-08-12T03:18:30.403 回答
3

如果你不介意改变你Option的位置,你可以使用Option::method.get_or_insert_with

fn main() {
    let mut my_opt: Option<String> = None;

    let ref_to_thing = my_opt.get_or_insert_with(|| "new thing created".to_owned());

    println!("{:?}", ref_to_thing);
}
于 2018-08-12T12:56:09.370 回答