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閉鎖のように変更可能
をキャプチャし、外側の変数を借りることができませんそのままのコード構造を保つ?
実際のコードでは、2つの接続が必要です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)