Actix中能否将路径存储在变量中用于get宏?
Actix中能否将路径存储在变量中用于get宏?
嘿,这个问题我之前也琢磨过!直接用普通变量确实行不通,原因和你猜的差不多——Actix的get是个属性宏,它是在编译阶段就会被处理的,而普通的变量是运行时才会有值的,编译期根本拿不到变量里的内容,自然没法用来生成路由路径。
不过也不是完全没办法,给你几个可行的方案:
用编译期常量替代变量
常量是在编译期就确定值的,属性宏可以正常读取它的内容,写法如下:use actix_web::{get, web, Responder}; // 定义编译期常量,必须是&'static str类型 const STATUS_PATH: &str = "/status"; #[get(STATUS_PATH)] async fn status() -> impl Responder { "OK" } #[actix_web::main] async fn main() -> std::io::Result<()> { use actix_web::{App, HttpServer}; HttpServer::new(|| App::new().service(status)) .bind(("127.0.0.1", 8080))? .run() .await }用自定义宏统一管理路径
如果有一堆路由路径需要统一维护,写个小宏也很方便,以后改路径只需要改宏定义就行:use actix_web::{get, web, Responder}; // 定义一个返回路径的宏 #[macro_export] macro_rules! status_path { () => { "/status" }; } #[get(status_path!())] async fn status() -> impl Responder { "OK" }放弃属性宏,手动注册路由
如果需要更灵活的路径配置(比如运行时动态调整,虽然一般路由都是编译期确定的),可以在App配置里用route方法手动注册,这种方式支持普通变量:use actix_web::{web, Responder, HttpResponse}; async fn status() -> impl Responder { HttpResponse::Ok().body("OK") } #[actix_web::main] async fn main() -> std::io::Result<()> { use actix_web::{App, HttpServer}; // 这里可以用普通变量,甚至运行时生成的字符串 let status_path = "/status"; HttpServer::new(move || { App::new() .route(status_path, web::get().to(status)) }) .bind(("127.0.0.1", 8080))? .run() .await }
简单总结下:要是想继续用get属性宏的简洁写法,就用编译期常量或自定义宏;要是需要动态变量的灵活性,就改用手动注册路由的方式~
内容来源于stack exchange
相关产品推荐
相关产品推荐

