Rust函数返回不同impl Trait实现触发E0308类型不匹配错误
错误原因
返回值位置的impl Share属于静态分发语法,仅对应唯一一个编译器可推断的具体类型,不支持在不同代码分支返回多个不同的、均实现了Share的类型。你的代码中if分支返回Data类型,else分支返回String类型,两个具体类型不一致,因此触发类型不匹配编译错误。
修复方案
不能修改test函数返回类型的前提下,自定义一个枚举类型,枚举的变体对应所有需要返回的Share实现类型,再为该枚举实现Share trait,让所有返回路径统一返回这个枚举类型即可,完全不需要改动原函数的返回声明。
修正后可编译的代码:
/// 第三方框架定义的trait,不可修改 trait Share { fn dosomething(); } impl Share for String { fn dosomething() { todo!() } } // 自定义统一返回枚举 enum ShareImpl { Data(Data), Str(String), } // 为枚举实现Share trait,内部匹配变体执行对应逻辑 impl Share for ShareImpl { fn dosomething() { // 按业务需求实现对应逻辑即可,原trait方法无self接收器,和原有实现规则一致 todo!() } } /// 你的业务函数,返回类型声明完全保持原样,未做任何修改 fn test(data: bool) -> Result<impl Share, String> { if data { Ok(ShareImpl::Data(Data {})) } else { Ok(ShareImpl::Str("a string".to_string())) } } struct Data {} impl Share for Data { fn dosomething() { todo!() } }
注意:不要将返回值改为Box<dyn Share>,该写法会变更函数返回类型,违反不能修改test函数声明的限制。
内容的提问来源于stack exchange,提问作者andre
相关产品推荐
相关产品推荐

