如何对Mutex包裹的enum_dispatch枚举实例调用try_into方法
问题原因
你的错误来自于直接对MutexGuard类型调用try_into方法,而enum_dispatch为MyBehaviorEnum生成的TryInto实现仅作用于枚举本身、枚举的不可变引用/可变引用,不支持MutexGuard智能指针类型。my_wrapped.lock().unwrap()返回的是MutexGuard<'_, MyBehaviorEnum>类型的智能指针,它通过Deref trait可以间接访问内部存储的MyBehaviorEnum实例,但不会自动转换为枚举本身参与方法调用匹配。
可行解决方案
下面分几种常用场景给出实现:
场景1:仅需获取具体实现的引用,不消耗枚举实例
不需要修改现有定义,直接解引用MutexGuard拿到枚举的引用后调用try_into即可:
fn main() { let a: MyBehaviorEnum = MyImplementorA {}.into(); let my_wrapped = Mutex::new(a); my_wrapped.lock().unwrap().my_trait_method(); // 修正部分:先解引用拿到枚举引用 let enum_guard = my_wrapped.lock().unwrap(); let convert_back_to_implementor: Result<&MyImplementorA, _> = (&*enum_guard).try_into(); if let Ok(implementor) = convert_back_to_implementor { // 这里可以正常使用MyImplementorA的引用 } }
如果需要可变引用,将&*换成&mut *即可。
场景2:需要获取具体实现的所有权(消耗枚举实例)
有两种实现方式可选:
- 方式1:直接取出Mutex内部的值(会消耗整个Mutex实例)
let enum_val = my_wrapped.into_inner().unwrap(); let convert_back_to_implementor: Result<MyImplementorA, _> = enum_val.try_into();
- 方式2:不消耗Mutex,克隆枚举实例后转换,需要给实现类型和枚举添加
Clone派生:
// 类型定义添加Clone派生 #[derive(Clone)] struct MyImplementorA {} #[derive(Clone)] struct MyImplementorB {} #[derive(Clone)] #[enum_dispatch] enum MyBehaviorEnum { MyImplementorA, MyImplementorB, } // 调用处代码 let enum_guard = my_wrapped.lock().unwrap(); let enum_clone = enum_guard.clone(); let convert_back_to_implementor: Result<MyImplementorA, _> = enum_clone.try_into();
内容的提问来源于stack exchange,提问作者ANimator120
相关产品推荐
相关产品推荐

