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

如何定义vecvec宏,实现类似vec!的向量的向量初始化?

实现Rust的vecvec!宏(嵌套向量初始化工具)

我们可以通过macro_rules!定义vecvec!宏,完全匹配你需要的几种用法,和原生vec!的语法风格保持一致:

macro_rules! vecvec {
    // 匹配多个数组元素(支持单个数组、空数组、末尾可选逗号)
    ($([$($elem:expr),* $(,)?]),* $(,)?) => {
        vec![$(vec![$($elem),*]),*]
    };
    // 匹配重复模式:[元素数组]; 重复次数
    ($([$($elem:expr),* $(,)?]); $n:expr) => {
        vec![vec![$($elem),*]; $n]
    };
}

宏分支说明

  • 第一个分支处理逗号分隔的数组集合:不管是多个数组、单个数组,甚至包含空数组的情况,都会把每个内部数组转换成Vec,再统一包裹成外层Vec。其中$(,)?是为了支持Rust惯用的末尾可选逗号,比如vecvec![[1,2], [3,4],]这种写法也能正常编译。
  • 第二个分支处理重复初始化场景:把内部的数组先转成单个Vec,然后重复指定的次数,生成嵌套向量。

验证示例用法

你给出的所有示例都能正常工作,以下是带断言验证的测试代码:

fn main() {
    let vv0 = vecvec![[2,3,4],[5,6,7]];
    assert_eq!(vv0, vec![vec![2,3,4], vec![5,6,7]]);

    let vv1 = vecvec![[1,2,3]];
    assert_eq!(vv1, vec![vec![1,2,3]]);

    let vv2 = vecvec![[1,2,3], []];
    assert_eq!(vv2, vec![vec![1,2,3], vec![]]);

    let vv3 = vecvec![[1,3,2]; 2];
    assert_eq!(vv3, vec![vec![1,3,2], vec![1,3,2]]);
}

内容的提问来源于stack exchange,提问作者azyx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:47