有沒有一種方法(生鏽)發送一個可變的借來的自我回調沒有mem::replace
黑客我在下面的MWE中使用?我正在使用防鏽(1.11.0)。回調可變自我
use std::mem;
trait Actable {
fn act(&mut self);
}
// Not Cloneable
struct SelfCaller {
message: String,
callback: Box<FnMut(&mut SelfCaller)>,
// other stuff
}
impl Actable for SelfCaller {
fn act(&mut self) {
fn noop(_: &mut SelfCaller) {}
let mut callback = mem::replace(&mut self.callback, Box::new(noop));
callback(self);
mem::replace(&mut self.callback, callback);
}
}
impl Drop for SelfCaller {
fn drop(&mut self) {/* unimiportant to the story */}
}
fn main() {
fn change(messenger: &mut SelfCaller) {
messenger.message = "replaced message".to_owned();
}
let mut messenger = SelfCaller {
message: "initial message".to_owned(),
callback: Box::new(change),
};
messenger.act();
println!("{}", &messenger.message);
}
謝謝!這很有幫助。但就我而言,回調成員是不可改變的。如果SelfCaller.callback成員從回調中隱藏,可以接受這樣做嗎? –
是的,如果'callback'成員不公開並且沒有改變它的公共方法,那麼在整個生命週期中作弊是安全的。請務必在代碼中留下一兩條評論來記錄'callback'成員不應該被用戶修改的事實,以便將來沒有人添加mutator方法! –