Rust中expected enum `Result`, found reference错误的原因与解决
问题解答
1. 编译错误产生的原因
HashMap::get方法接收键的引用后,返回的是Option<&V>类型(即对对应值的引用),而你的HttpClient trait要求send_request方法返回值类型Result<Response, reqwest::Error>,两者类型不匹配,因此编译器抛出类型错误。
2. 使用.clone()无法解决问题的原因
你直接在unwrap()后调用.clone()时,操作的对象是&Result<Response, reqwest::Error>(引用类型)。Rust中对引用类型实现的Clone trait只会返回原引用本身(因为引用是Copy的),并不会克隆引用指向的Result值,因此最终返回的仍然是引用类型,和trait要求的返回类型还是不匹配。
3. 修改方案
有两种常用的修正方式:
方式一:使用Option::cloned()
利用Option::cloned()方法将Option<&Result>转换为Option<Result>(reqwest::Response和reqwest::Error均已实现Clone),再调用unwrap()得到值类型:
#[async_trait] impl HttpClient for MockClient { async fn send_request(&self, path: String) -> Result<Response, Error> { self.res_req.get(&path).cloned().unwrap() } }
方式二:手动解引用后克隆
先通过解引用获取引用指向的Result值,再调用clone()复制:
#[async_trait] impl HttpClient for MockClient { async fn send_request(&self, path: String) -> Result<Response, Error> { (*self.res_req.get(&path).unwrap()).clone() } }
额外可选方案(需修改trait)
如果测试场景允许修改MockClient状态,可以用HashMap::remove直接取出值(但同一个MockClient对应路径只能被调用一次):
// 先修改trait的方法签名 #[async_trait] pub trait HttpClient { async fn send_request(&mut self, path: String) -> Result<Response, Error>; } // 再实现MockClient #[async_trait] impl HttpClient for MockClient { async fn send_request(&mut self, path: String) -> Result<Response, Error> { self.res_req.remove(&path).unwrap() } }
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

