在处理多个闭包时如何避免多个 Arc::clone?

How to avoid multiple Arc::clone when dealing with multiple closures?

提问人:newSqlz 提问时间:12/14/2022 更新时间:12/14/2022 访问量:156

问:

    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

异步 Rust 闭包

评论

0赞 PitaJ 12/14/2022
在您的代码中,您似乎不需要放置在第二个块中。store.insert(x, x);async move

答:

2赞 cafce25 12/14/2022 #1

把它们排除在外,唯一必要的克隆是里面的克隆,因为每次迭代都需要它自己的。iterArc

除非问题中未提及某些要求,否则这有效。

    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