You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:39:03