提问人:newSqlz 提问时间:12/14/2022 更新时间:12/14/2022 访问量:156
在处理多个闭包时如何避免多个 Arc::clone?
How to avoid multiple Arc::clone when dealing with multiple closures?
问:
let store = Arc::new(DashMap::new());
tokio::spawn({
let store = Arc::clone(&store);
async move {
stream::iter(vec![17, 19]).for_each(move |x| {
let store = Arc::clone(&store);
async move {
store.insert(x, x);
}
})
}
});
我必须克隆两次并在块后面进行克隆,以便能够在闭包深处使用它一次。
有什么方法可以简化这样的代码吗?async
答:
2赞
cafce25
12/14/2022
#1
把它们排除在外,唯一必要的克隆是里面的克隆,因为每次迭代都需要它自己的。iter
Arc
除非问题中未提及某些要求,否则这有效。
let store = Arc::new(DashMap::new());
tokio::spawn(async move {
stream::iter(vec![17, 19]).for_each(move |x| {
let store = Arc::clone(&store);
async move {
store.insert(x, x);
}
})
});
如果可以将插入移动到最内层的块之外,则甚至可以删除该克隆。async move
下一个:异步移动闭包与折叠
评论
store.insert(x, x);
async move