如何编写转发至vec!宏的Rust可变参数宏?
实现自定义
intersections!宏解耦容器依赖 首先定义你的Intersection结构体和类型别名:
struct Intersection { // 根据需求添加字段,示例: distance: f64, // 其他字段... } // 用类型别名封装容器实现 type Intersections = Vec<Intersection>;
接下来实现intersections!宏,内部转发参数给vec!,同时确保返回Intersections类型:
#[macro_export] macro_rules! intersections { // 支持任意数量的参数,包括末尾可选逗号 ($($element:expr),* $(,)?) => { vec![$($element),*] as Intersections }; }
使用示例
fn main() { let intersect1 = Intersection { distance: 1.5 }; let intersect2 = Intersection { distance: 3.2 }; let intersect3 = Intersection { distance: 5.0 }; // 调用自定义宏创建容器 let mut intersections = intersections![intersect1, intersect2, intersect3]; // 也支持末尾逗号的写法:intersections![intersect1, intersect2, intersect3,] }
后续更换容器实现
如果之后需要替换容器(比如换成LinkedList),只需修改类型别名和宏的内部实现,所有调用intersections!的代码无需改动:
// 修改类型别名 type Intersections = std::collections::LinkedList<Intersection>; // 更新宏实现 #[macro_export] macro_rules! intersections { ($($element:expr),* $(,)?) => { { let mut container = Intersections::new(); $(container.push_back($element);)* container } }; }
内容的提问来源于stack exchange,提问作者davidA
相关产品推荐
相关产品推荐

