Rust新手使用Fred库并行Redis请求遇类型推断错误求助
解决Fred库并行Redis请求的类型推断问题
你遇到的核心问题是泛型类型推断失败:Fred的get方法是泛型函数,编译器无法自动推导返回类型R(你预期的Option类型),导致代码无法编译。错误提示中的cannot infer type for type parameter R直接点明了原因。
问题代码分析
这段代码的问题在于,vec!{}没有指定具体类型,且get方法的返回类型未明确告知编译器:
let resp_futures = vec!{}; for key in keys.iter() { resp_futures.push(state.redis.get(key)); } let resps = join_all(resp_futures).await;
解决方案
有两种简洁的方式解决这个类型推断问题:
方案1:直接指定get方法的泛型参数
在调用get时,明确标注返回类型R(比如你需要的Option<String>),K参数可由编译器自动推断:
#[post("/v1/route")] async fn route(state: web::Data<AppState>, req: web::Form<RouteRequest>) -> impl Responder { let keys = get_redis_keys(req); let mut resp_futures = Vec::new(); for key in keys.iter() { // 明确指定返回类型为Option<String> resp_futures.push(state.redis.get::<Option<String>, _>(key)); } let resps = join_all(resp_futures).await; // 后续可根据业务处理结果,比如收集成功返回的值 let values: Vec<Option<String>> = resps.into_iter() .filter_map(|result| result.ok()) .collect(); HttpResponse::Ok().content_type(ContentType::json()).body(format!(r#"{{"status": "ok", "values": {:?}}}"#, values)) }
方案2:提前声明resp_futures的具体类型
先定义resp_futures的类型为Vec<AsyncResult<Option<String>>>,编译器就能自动匹配get方法的返回值:
#[post("/v1/route")] async fn route(state: web::Data<AppState>, req: web::Form<RouteRequest>) -> impl Responder { let keys = get_redis_keys(req); // 明确指定Vec的元素类型 let mut resp_futures: Vec<AsyncResult<Option<String>>> = Vec::new(); for key in keys.iter() { resp_futures.push(state.redis.get(key)); } let resps = join_all(resp_futures).await; // 处理结果示例 let values: Vec<Option<String>> = resps.into_iter() .filter_map(|result| result.ok()) .collect(); HttpResponse::Ok().content_type(ContentType::json()).body(format!(r#"{{"status": "ok", "values": {:?}}}"#, values)) }
补充注意事项
AsyncResult<T>是Fred库的类型别名,等价于Result<T, RedisError>,实际项目中建议妥善处理错误(比如返回500状态码),不要直接用filter_map忽略错误。- 如果Redis中存储的不是字符串,只需将
Option<String>替换为对应的类型(比如Option<serde_json::Value>),只要该类型实现了Fred的FromRedistrait即可。
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

