如何定义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
相关产品推荐
相关产品推荐

