Проблема с использованием String в нескольких функциях - PullRequest
0 голосов
/ 20 января 2020

Я новичок в Rust, и у меня небольшие проблемы со String. У меня есть такая структура:

#[derive(Deserialize, Debug)]
pub struct Config {
    pub filepath: String,
    #[serde(default = "default_port")]
    pub port: i16
}

Мне нужно поле filepath в нескольких методах, используя здесь:

pub fn startup(port: i16, filepath: String) -> () {
    let mut server = Nickel::new();
    server.get("/", middleware! { |request, mut response|
        routes::base::home(request, filepath)
    });
    routes::index_route(&mut server, filepath);

    let addr = format!("127.0.0.1:{}", port);
    println!("Start Rest Api successfully");
    server.listen(addr).unwrap();
}

Дом определяется так: pub fn home(_request: &mut nickel::Request, path: String) -> String

И index_route: pub fn index_route(server: &mut Nickel, path_data: String) -> ()

Но у меня есть эта ошибка: use of moved value: filepath Я использую to_owned или clone или to_string, и я не понимаю, почему это не работает. Я прочитал книгу, но мне кажется, что чего-то не хватает

Большое спасибо за вашу помощь

1 Ответ

1 голос
/ 26 января 2020

Вам необходимо клонировать строку перед тем, как переместить ее в замыкание:

pub fn startup(port: i16, filepath: String) -> () {
    let mut server = Nickel::new();

    let filepath_clone = filepath.clone();
    server.get("/", middleware! { |request, mut response|
        // use the clone from above
        routes::base::home(request, filepath_clone)
    });

    // the original is still accessible
    routes::index_route(&mut server, filepath);

    let addr = format!("127.0.0.1:{}", port);
    println!("Start Rest Api successfully");
    server.listen(addr).unwrap();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...