Rust编译报错:Response<BoxBody>未实现Copy trait,HashMap取值问题求解
解决Rust中HashMap存储Response后取出的所有权问题
错误原因
你遇到的两个错误本质都是所有权问题:
.copied()要求目标类型实现Copytrait,但hyper::Response<BoxBody<Bytes, std::io::Error>>未实现该 trait,因此编译报错。- 使用
*解引用get()返回的引用时,Rust不允许直接从借用的引用中移动值(原数据仍属于HashMap),所以会抛出“Cannot move”错误。
两种解决方案
方案1:从HashMap中移除并取出值(适合仅需一次取出的场景)
如果HashMap中的这个Response只用一次,直接用 remove() 替代 get(),它会将值从HashMap中移出并返回:
pub async fn router( req: Request<hyper::body::Incoming>, remote_addr: SocketAddr ) -> hyper::Result<Response<BoxBody<Bytes, std::io::Error>>> { let selector = "<a key>"; let mut funcs = HashMap::new(); funcs.insert("<a key>", my_async_function(args).await); // 用remove取出值并从HashMap中移除 let result = funcs.remove(&selector).unwrap(); Ok(result) }
方案2:克隆Response(适合需要保留HashMap中值的场景)
如果之后还要复用HashMap里的Response,可以调用 .clone() 复制一份(hyper::Response 已实现 Clone trait,内部的 Bytes 和 std::io::Error 也支持克隆):
pub async fn router( req: Request<hyper::body::Incoming>, remote_addr: SocketAddr ) -> hyper::Result<Response<BoxBody<Bytes, std::io::Error>>> { let selector = "<a key>"; let mut funcs = HashMap::new(); funcs.insert("<a key>", my_async_function(args).await); // 克隆一份Response,原数据保留在HashMap中 let result = funcs.get(&selector).unwrap().clone(); Ok(result) }
额外提示
如果你的场景是预先缓存多个Response并复用,方案2更合适;如果只是临时存储后立即取出使用,方案1更高效(避免克隆开销)。
内容的提问来源于stack exchange,提问作者ArthurZhou
相关产品推荐
相关产品推荐

