Rust重构函数返回类型声明问题:C++转Rust开发者求助
解决方案
直接使用impl Transform作为函数返回类型,Rust支持在返回值位置用impl Trait表示“实现了指定 trait 的具体类型”,无需写出冗长的完整类型:
use actix_web::dev::{ServiceRequest, Transform}; use actix_web::Error; use actix_web_httpauth::extractors::bearer::BearerAuth; use actix_web_httpauth::middleware::HttpAuthentication; use crate::server::auth::common::validate_bearer; pub fn create_auth_middleware() -> impl Transform<ServiceRequest, Response = ServiceRequest, Error = Error> { HttpAuthentication::bearer(validate_bearer) }
错误原因分析
create_auth_middleware_1:Rust函数未指定返回类型时默认返回()(空单元类型),但你返回了HttpAuthentication实例,类型不匹配导致报错。create_auth_middleware_2:泛型T由调用者决定类型,但你返回的是固定的HttpAuthentication,编译器无法将固定类型匹配到任意泛型参数,因此报错。create_auth_middleware_3:泛型T是调用者指定的类型,与你返回的具体HttpAuthentication类型不兼容,编译器无法统一两者。create_auth_middleware_4/5:impl Future仅允许出现在函数/方法的返回值位置,不能作为函数指针的返回类型;同时HttpAuthentication的第二个泛型参数是返回impl Future的函数,这类不透明类型无法直接显式写出。
灵活场景补充
如果需要在函数中返回不同的Transform实现,可以使用 trait object(动态分发),返回Box<dyn Transform<...>>:
pub fn create_auth_middleware() -> Box<dyn Transform<ServiceRequest, Response = ServiceRequest, Error = Error>> { Box::new(HttpAuthentication::bearer(validate_bearer)) }
这种方式会引入轻微的运行时开销,但换取了类型灵活性。
内容的提问来源于stack exchange,提问作者lewis
相关产品推荐
相关产品推荐

