You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的FromRedis trait即可。

内容的提问来源于stack exchange,提问作者eof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:20:19