2013-12-08 1 views
1

я не понимаю, почему rustc дает мне эту ошибку error: use of moved value: 'f' во время компиляции, с помощью следующего кода:Почему я не могу повторно использовать заимствованный указатель FUNTION в

fn inner(f: &fn(&mut int)) { 
    let mut a = ~1; 
    f(a); 
} 

fn borrow(b: &mut int, f: &fn(&mut int)) { 
    f(b); 
    f(b); // can reuse borrowed variable 

    inner(f); // shouldn't f be borrowed? 

    // Why can't I reuse the borrowed reference to a function? 
    // ** error: use of moved value: `f` ** 
    //f(b); 
} 

fn main() { 
    let mut a = ~1; 
    print!("{}", (*a)); 
    borrow(a, |x: &mut int| *x+=1); 
    print!("{}", (*a)); 
} 

Я хочу, чтобы повторно закрыть после того, как я прохожу это как аргумент другой функции. Я не уверен, является ли это копией или закрытием стека, есть ли способ рассказать?

Этот фрагмент был для rustc 0.8. Мне удалось скомпилировать другую версию кода с последним rustc (master: g67aca9c), изменив &fn(&mut int) на простой fn(&mut int) и используя обычные функции вместо закрытия, но как я могу заставить это работать с закрытием?

+0

Я прочитал [Детективная работа по закрытию ржавчины] (http://blog.pnkfx.org/blog/2013/06/07/detective-work-on-rust-closures/), но я не совсем понимаю это еще. –

ответ

1

Дело в том, что &fn is На самом деле не заимствованный указатель в нормальном смысле слова. Это тип закрытия. В master, типы функций были исправлены много, а синтаксис для таких вещей изменился на |&mut int| - если вы хотели заимствованный указатель на функцию, на данный момент вам нужно ввести его &(fn (...)) (&fn обозначен устаревший синтаксис на данный момент , чтобы помочь людям уйти от него, потому что это совершенно отличный тип).

Но для закрытий вы можете пройти мимо них по ссылке: &|&mut int|.

+0

Я вижу, этот [snippet действительно работает] (https://gist.github.com/hackaugusto/7864860), спасибо –