You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写转发至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:27:11