Borrowed value does not live long enough


#1

Вот не понимаю почему, такой код:

pub fn run_blocks(cnc: Rc<RefCell<Controller>>, blocks: Blocks) -> impl Future<Item=(), Error=Error>  {
    let cnc_start = cnc.clone();
    let cnc_load = cnc.clone();
    load(cnc, blocks)
    .and_then(move |(blocks, runtime)| cnc_start.borrow_mut().start().map(|_| (blocks, runtime)))
    .and_then(move |(blocks, runtime)| loop_fn((blocks, runtime), move |(blocks, runtime)| {
            let cnc_load_clone = cnc_load.clone();
            Delay::new(Instant::now() + runtime - Duration::from_secs(1))
            .map_err(|err| panic!("timer failed; err={:?}", err))
            .and_then(move |_| load(cnc_load_clone, blocks).map(|(blocks, runtime)| {
                if blocks.is_empty() {
                    Loop::Break((blocks, runtime))
                } else {
                    Loop::Continue( (blocks, runtime) )
                }
            }))
        }).map(|_| () )
    )
}

вызывает ошибку:

error[E0597]: `cnc_start` does not live long enough
  --> plc/src/lib.rs:78:40
   |
78 |     .and_then(move |(blocks, runtime)| cnc_start.borrow_mut().start().map(|_| (blocks, runtime)))
   |                                        ^^^^^^^^^ borrowed value does not live long enough      - `cnc_start` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

and_then - принимает FnOnce и в замыкание передано значение. Что не так?


#2

нарывался на подобное когда пытался максимально близко переписывать на Rust С код.
попробуй заинлайнить
убрав
let cnc_start = cnc.clone() совсем

 load(cnc, blocks)
    .and_then(move |(blocks, runtime)| cnc.clone().borrow_mut().start().map(|_| (blocks, runtime)))

#3

попробовал, та же самая ошибка.
код для экспериментов


#4

Похоже несовершенство borrow checker’а в Rust’2015.
Разбивка цепочки вызовов фиксит проблему

            let res = cnc_start
                .borrow_mut()
                .start();
            res
                .map(move |_| (blocks, runtime))