使用 Axum,创建路由器时出现错误 "use of moved value: `router`",但为什么呢?
Using Axum, creating a router I get error "use of moved value: `router`" but why?
我来自围棋。我是 Rust 的新手。
我正在使用 axum
和此代码来创建服务器:
use axum::{response::Html, routing::get, Router};
use std::net::SocketAddr;
#[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));
}
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(router.into_make_service())
.await
.unwrap();
}
async fn handler() -> Html<&'static str> {
Html("<h1>Hello, World!</h1>")
}
但它给出了这个错误:
33 | let router = Router::new();
| ------ move occurs because `router` has type `Router`, which does not implement the `Copy` trait
34 |
35 | &router.route("/", get(handler));
| ------ value moved here
...
55 | .serve(router.into_make_service())
| ^^^^^^ value used here after move
我该如何解决这个问题?
我应该使用 .clone()
吗?
我试过 &router
但我仍然收到错误。
使用此代码有效:
let mut router = Router::new();
router = router.route("/", get(handler));
if true {
router = router.route(...);
}
这是简化的代码(Axum 做同样的事情)。 route
获得所有权,但也 returns 它。
#[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
in-line,或者设置 mut
并将 route
的结果重新分配给 router
变量。
我来自围棋。我是 Rust 的新手。
我正在使用 axum
和此代码来创建服务器:
use axum::{response::Html, routing::get, Router};
use std::net::SocketAddr;
#[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));
}
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(router.into_make_service())
.await
.unwrap();
}
async fn handler() -> Html<&'static str> {
Html("<h1>Hello, World!</h1>")
}
但它给出了这个错误:
33 | let router = Router::new();
| ------ move occurs because `router` has type `Router`, which does not implement the `Copy` trait
34 |
35 | &router.route("/", get(handler));
| ------ value moved here
...
55 | .serve(router.into_make_service())
| ^^^^^^ value used here after move
我该如何解决这个问题?
我应该使用 .clone()
吗?
我试过 &router
但我仍然收到错误。
使用此代码有效:
let mut router = Router::new();
router = router.route("/", get(handler));
if true {
router = router.route(...);
}
这是简化的代码(Axum 做同样的事情)。 route
获得所有权,但也 returns 它。
#[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
in-line,或者设置 mut
并将 route
的结果重新分配给 router
变量。