首页 文章

闭包 - 使用移动值

提问于
浏览
0

我目前正在尝试使用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' . 我有点知道这个问题,但我真的不知道如何解决这个问题 . 我仍然很生锈 .

1 回答

  • 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())))
        });
    }
    

相关问题