2013-12-08 69 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)); 
} 

我想重用我通過後關閉它作爲另一個函數的參數。我不確定它是可複製還是堆棧封閉,有沒有辦法說明?

該代碼段用於生鏽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在正常意義上實際上不是借來的指針。這是一個封閉類型。在master中,函數類型已經被修復了很多,並且這種事情的語法已經改變爲|&mut int| - 如果你想要一個借用函數指針,目前你需要輸入它&(fn (...))&fn現在被標記爲過時的語法,幫助人們遠離它,因爲它是完全不同的類型)。

但是對於關閉,您可以通過引用將它們傳遞給:&|&mut int|

+0

我明白了,這個[snippet does work](https://gist.github.com/hackaugusto/7864860),謝謝 –

相關問題