我使用axum和这段代码来创建一个服务器,但是我得到了一个错误:
use axum::{response::Html, routing::get, Router};
async fn handler() -> Html<&'static str> {
Html("<h1>Hello, World!</h1>")
}
#[tokio::main]
async fn main() {
let router = Router::new();
router.route("/", get(handler));
if true { // I need to check something here
router.route("/other", get(handler));
}
axum::Server::bind(&([127, 0, 0, 1], 3000).into())
.serve(router.into_make_service())
.await
.unwrap();
}error[E0382]: use of moved value: `router`
--> src\main.rs:18:16
|
9 | let router = Router::new();
| ------ move occurs because `router` has type `Router`, which does not implement the `Copy` trait
10 |
11 | router.route("/", get(handler));
| ------ value moved here
...
14 | router.route("/other", get(handler));
| ------ value moved here
...
18 | .serve(router.into_make_service())
| ^^^^^^ value used here after move我试过使用&router,但仍然会遇到错误。我怎么才能解决这个问题?我应该使用.clone()吗?
发布于 2022-05-07 22:21:49
下面是简化的代码(Axum做了同样的事情)。route获得所有权,但也返回它。
#[derive(Debug)]
struct Router {
list: Vec<String>,
}
impl Router {
fn new() -> Self {
Router { list: vec![] }
}
fn route(mut self, path: String) -> Self {
self.list.push(path);
self
}
}
fn main() {
let mut router = Router::new().route("/1".to_owned()).route("/2".to_owned());
if true {
router = router.route("/3".to_owned());
}
println!("{:?}", router);
}因此,您必须将router设置为内联,或者使其成为mut,并将route的结果重新分配给router变量。
发布于 2022-05-07 22:18:35
使用此代码,它可以工作:
let mut router = Router::new();
router = router.route("/", get(handler));
if true {
router = router.route(...);
}https://stackoverflow.com/questions/72156620
复制相似问题