使用 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 变量。