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)