闭包 - 使用移动值

时间:2015-11-26 17:38:55

标签: compiler-errors closures rust

我目前正在尝试使用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())))
}

我得到的错误是E0382capture of moved value: 'some_data'。我有点知道这个问题,但我真的不知道如何解决这个问题。我仍然很生锈。

1 个答案:

答案 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