临时成员的比赛寿命不足

时间:2018-07-04 18:14:59

标签: rust borrow-checker

以下代码无法编译(playground)

#![allow(unused)]
use std::cell::RefCell;

enum Token {
    A,
    B,
}

struct Thing {
    c: Token,
}

fn main() {
    let a = RefCell::new(Thing { c: Token::A });

    if let Token::A = a.borrow().c {
        //Error!
    }
}

由于以下错误而失败:

error[E0597]: `a` does not live long enough
  --> src/main.rs:16:23
   |
16 |     if let Token::A = a.borrow().c {
   |                       ^ borrowed value does not live long enough
...
19 | }
   | - `a` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

如果我在语句后添加任何内容,即使是单个;也可以正常工作:

if let Token::A = a.borrow().c { 
};  // Ok

我认为这是因为if的值被用作main的返回值,因此if let中的借用以某种方式扩展了。但这不应该发生,只是()!还是我不了解的东西?

顺便说一句,同样的事情发生在:

match a.borrow().c {
    _ => ()
}

0 个答案:

没有答案