2016-08-17 22 views
2
use std::rc::Rc; 

fn f1(cb: Box<Fn(i32)->i32>) { 
    let res = cb(15); 
    println!("res {}", res); 
} 

fn main() { 
    let mut v2 = Rc::new(5_i32); 
    //1 
    //f1(Box::new(move |x: i32| *v2 + x)); 
    //2 
    f1(Box::new(move |x: i32| { let tmp = *v2; *Rc::get_mut(&mut v2).unwrap() = tmp + 1; x + *v2 })); 
} 

代碼引用爲「1」,如果未註釋,則編譯並運行得很好。當使用帶Rc的閉包時,無法在Fn閉包中借用捕獲的外部變量

但作爲,是不能編譯,與消息錯誤的代碼

不能借用捕獲外層變量的Fn封閉的可變

我怎樣才能解決這個問題,如果我想保持代碼結構,因爲它是?

在我的真實代碼中,我想連接兩個trait s。其中一人將呼籲事件的回調,以及其他有函數來處理回調:

trait Foo { 
    pub fn add_callback(&mut self, cb: Box<Fn(i32)>); 
} 

trait Boo { 
    pub fn on_new_data(&mut self, data: i32); 
} 

我想創建一個特質物體Boo,與Rc包裝它,並且它的形式傳遞給Foo::add_callback|x:i32| Rc::get_mut(&mut boo).unwrap().on_new_data(x)

回答

2

的錯誤消息是大多有所幫助:

error: cannot borrow captured outer variable in an `Fn` closure as mutable 
    --> src/main.rs:13:27 
13 |>   *Rc::get_mut(&mut v2).unwrap() = tmp + 1; 
    |>       ^^ 
help: consider changing this closure to take self by mutable reference 
    --> src/main.rs:11:17 
11 |>  f1(Box::new(move |x: i32| { 
    |>    ^

注:

不能借用捕獲外層變量在Fn閉合作爲可變

改變f1接受FnMut並使可變可變允許代碼編譯:

fn f1(mut cb: Box<FnMut(i32) -> i32>) { 

這是需要以便將&mut v2參數所需的捕獲變量v2變爲Rc::get_mut

相關問題