You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Rust中通过宏生成指定长度的常量数组?

如何在Rust中通过宏生成指定长度的常量数组?

当然可以!Rust的宏系统灵活性拉满,完全能实现你想要的功能——通过define_exps!(9)这样的调用生成指定长度的常量数组。下面我给你两种实用的实现方案:

方案一:利用常量循环初始化(简单直观)

这种写法借助Rust支持的常量求值逻辑,用循环来填充数组,代码简洁易懂,适合大多数场景:

macro_rules! define_exps {
    ($len:literal) => {
        const EXPS: [i64; $len] = {
            // 先初始化一个全0的数组
            let mut arr = [0; $len];
            let mut idx = 0;
            // 循环填充每个元素:第0位是1,后续是10的对应幂次
            while idx < $len {
                arr[idx] = if idx == 0 {
                    1
                } else {
                    10_i64.pow(idx as u32)
                };
                idx += 1;
            }
            arr
        };
    };
}

使用示例

// 生成长度为9的常量数组
define_exps!(9);

fn main() {
    println!("{:?}", EXPS);
    // 输出结果:[1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000]
}

方案二:宏递归展开(纯宏语法实现)

如果你想完全用宏的语法展开来生成每个元素(不依赖常量循环),可以用递归宏来逐个生成数组项:

// 对外暴露的主宏
macro_rules! define_exps {
    ($len:literal) => {
        const EXPS: [i64; $len] = define_exps_helper!(0, $len);
    };
}

// 内部辅助递归宏,负责生成元素列表
macro_rules! define_exps_helper {
    // 递归终止条件:当前索引等于数组长度,返回空数组
    ($current:literal, $len:literal) if $current >= $len => { [] };
    // 递归生成:当前元素 + 后续元素
    ($current:literal, $len:literal) => {
        [
            if $current == 0 { 1 } else { 10_i64.pow($current as u32) },
            // 递归调用,索引+1
            ..define_exps_helper!($current + 1, $len)
        ]
    };
}

注意事项

  • 两种方案都要求传入的数组长度是编译期常量(比如字面量9,或者用const定义的常量),因为Rust的数组长度必须在编译时确定。
  • 10_i64.pow()的参数是u32类型,所以我们需要把索引idx转成u32,确保类型匹配。

备注:内容来源于stack exchange,提问作者wub

火山引擎 最新活动