gpt4 book ai didi

compiler-errors - 闭包——移动值的使用

转载 作者:行者123 更新时间:2023-11-29 08:30:08 25 4
gpt4 key购买 nike

我目前正在尝试使用 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'。我有点知道这个问题,但我真的不知道如何解决这个问题。我对 Rust 还是很陌生。

最佳答案

看来您可以在将此 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())))
});
}

关于compiler-errors - 闭包——移动值的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33944411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com