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

Rust中如何用const函数便捷初始化全局常量数组?

如何用const函数便捷初始化全局常量数组

在Rust中,有两种主流方式可以实现你需要的便捷初始化,无需手动逐个填写数组元素:

方式一:使用const块+循环(Rust 1.59+)

从Rust 1.59版本开始,常量上下文支持循环语句,可以直接在编译期完成数组填充:

pub const fn fib(n: i32) -> i32 {
    if n <= 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

const SEQUENCE_LENGTH: usize = 200;
const FIBONACCI_SEQUENCE: [i32; SEQUENCE_LENGTH] = {
    let mut arr = [0; SEQUENCE_LENGTH];
    let mut idx = 0;
    while idx < SEQUENCE_LENGTH {
        arr[idx] = fib(idx as i32);
        idx += 1;
    }
    arr
};

fn main() {
    println!("第10项:{}", FIBONACCI_SEQUENCE[10]); // 输出 55
}

这种写法逻辑直观,和普通运行时的数组填充代码几乎一致,所有计算都在编译期完成,完全满足全局常量的要求。

方式二:使用递归宏(兼容旧版本Rust)

如果需要兼容Rust 1.59之前的版本,可以用递归宏自动生成元素列表:

pub const fn fib(n: i32) -> i32 {
    if n <= 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

macro_rules! const_array_from_fn {
    ($func:ident, $len:expr) => {{
        const ARRAY: [i32; $len] = const_array_from_fn!(@build $func, 0, $len);
        ARRAY
    }};
    (@build $func:ident, $current:expr, $len:expr) => {{
        if $current == $len {
            []
        } else {
            [$func($current as i32), ..const_array_from_fn!(@build $func, $current + 1, $len)]
        }
    }};
}

const FIBONACCI_SEQUENCE: [i32; 200] = const_array_from_fn!(fib, 200);

fn main() {
    println!("第50项:{}", FIBONACCI_SEQUENCE[50]);
}

宏会递归生成从0到指定长度的所有函数调用,最终拼接成数组初始化表达式。Rust默认的宏递归深度足够处理200长度的需求。

注意事项

  • 确保你的const fn仅使用编译期支持的操作,比如不能包含动态内存分配、可变引用操作等。
  • 优先选择第一种方式,代码可读性和维护性远高于宏实现,除非有兼容旧版本的硬性需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:37:02