Rust自定义Emitter结构体中调用FnMut回调报所有权错误如何解决
问题原因
报错是Rust所有权规则导致的:Option::unwrap() 方法会消耗当前Option实例并获取内部值的所有权,而你仅持有&mut self可变借用,无权将结构体成员self.cb的所有权转移走,且&mut引用未实现Copy trait 无法隐式复制,因此触发编译错误。
修复方案
使用Option::as_mut()方法借用Option内部的值,无需转移所有权即可拿到闭包的可变引用;同时推荐使用if let模式匹配替代is_some() + unwrap()的组合,写法更简洁安全,也符合Rust惯用法。
完整可运行代码
type Callback<'a> = Option<&'a mut dyn FnMut()>; struct Emitter<'a> { cb: Callback<'a> } impl<'a> Emitter<'a> { fn emit(&mut self) { if let Some(f) = self.cb.as_mut() { f(); } } } fn main() { let mut cb = || println!("test"); let mut e = Emitter { cb : Some(&mut cb) }; e.emit(); }
运行后会正常输出test,且支持多次调用emit()方法,不会消耗存储的闭包引用。
内容的提问来源于stack exchange,提问作者Lut Ze
相关产品推荐
相关产品推荐

