Следующий код не компилируется (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 {
_ => ()
}
feature(nll)
, без файла cookie. Используяlet b: () = a.borrow().c;
, компилятор хочет, чтобыb
имел типToken
(НЕ&Token
). Итак, у нас есть заимствование без какой-либо выдающейся ссылки... oO - person Matthieu M.   schedule 05.07.2018#![feature(nll)]
+RUSTFLAGS='-Z polonius'
). - person Shepmaster   schedule 05.07.2018