有没有简便方法将Rc的克隆值移入多个闭包中?
最优实现方案
你可以通过自定义克隆宏来消除重复的手动克隆代码,这种方案没有额外运行时开销,和手动手写克隆逻辑性能完全一致,是Rust社区处理这类场景的通用做法。
1. 定义通用克隆宏
/// 自动克隆指定变量后生成move闭包 macro_rules! clone { // 支持无参数闭包 ($($var:ident),+ => move || $body:expr) => {{ $(let $var = $var.clone();)+ move || $body }}; // 支持带参数闭包 ($($var:ident),+ => move |$($param:pat),*| $body:expr) => {{ $(let $var = $var.clone();)+ move |$($param),*| $body }}; }
2. 改写示例代码
使用宏之后的代码简洁度大幅提升:
use std::rc::Rc; let val = Rc::new(my_val); closure_func1(clone!(val => move || { do_stuff1(val) })); closure_func2(clone!(val => move || { do_stuff2(val) })); closure_func3(clone!(val => move || { do_stuff3(val) }));
补充说明
- 该宏支持同时克隆多个变量进闭包,按格式写
clone!(a, b, c => move || { ... })即可,适合需要传入多个共享变量的场景 - 宏不仅适配
Rc,也支持Arc、字符串等所有实现了Clonetrait的类型,复用性极强 - 如果你不想自己维护宏,也可以直接使用三方库中封装好的同类宏,逻辑和上面的实现完全一致
内容的提问来源于stack exchange,提问作者Maxim Gritsenko
相关产品推荐
相关产品推荐

