我目前正在尝试使用iron框架。我正在使用他们的中间件router。我现在的问题是我有一个名为default_data
的变量,我想默认使用它。从早期的研究中,我知道我必须在我的闭包中使用move
关键字。但是这会导致我的default_data
变量出现问题,在第一个变量添加到路由器后,该变量无法用于任何其他闭包。
这大致是我的代码部分的样子:
let mut router = Router::new();
let default_data = std::collections::BTreeMap::<String, String>::new();
default_data.insert("test".to_string(), "data".to_string());
router.get("/", move |_| {
let mut new_data = default_data.clone();
new_data.insert("test2".to_string(), "some other data".to_string());
Ok(Response::with((status::Ok, new_data.get("test2".to_string()).unwrap())))
}
router.get("/test", move |_| {
let mut new_data = default_data.clone();
new_data.insert("test2".to_string(), "some other data again".to_string());
Ok(Response::with((status::Ok, new_data.get("test".to_string()).unwrap())))
}
我得到的错误是E0382
,capture of moved value: 'some_data'
。我有点知道这个问题,但我真的不知道如何解决这个问题。我仍然很生锈。
答案 0 :(得分:1)
在将default_data
发送到每个帖子之前,似乎你可以克隆这个let mut router = Router::new();
let default_data = BTreeMap::new();
default_data.insert("test".to_owned(), "data".to_owned());
{
let mut new_data = default_data.clone();
router.get("/", move |_| {
new_data.insert("test2".to_owned(), "some other data".to_owned());
Ok(Response::with((status::Ok, new_data.get("test2".to_owned()).unwrap())))
});
}
{
let mut new_data = default_data.clone();
router.get("/test", move |_| {
new_data.insert("test2".to_owned(), "some other data again".to_owned());
Ok(Response::with((status::Ok, new_data.get("test".to_owned()).unwrap())))
});
}
,对吧?然后你只需要在闭包的外面克隆它
0