Arrays 距离常数数组

Arrays 距离常数数组,arrays,rust,constants,compile-time,rust-no-std,Arrays,Rust,Constants,Compile Time,Rust No Std,如何使用从范围中获取的值生成长常量数组? 奖励:1)不使用任何标准,2)不使用任何板条箱 我想做的是: struct A { a: i32, b: B } enum B { One, Two } const AS: [A; 1024] = [A{a: 1, b: B::One}, A{a: 2, b: B::One}, ..., A{a: 1024, b: B::One}] 到目前为止,我得到的最远信息是: macro_rules! generate_lis

如何使用从范围中获取的值生成长常量数组? 奖励:1)不使用任何标准,2)不使用任何板条箱

我想做的是:

struct A {
    a: i32,
    b: B
}

enum B {
    One,
    Two
}

const AS: [A; 1024] = [A{a: 1, b: B::One}, A{a: 2, b: B::One}, ..., A{a: 1024, b: B::One}]
到目前为止,我得到的最远信息是:

macro_rules! generate_list {
    ($($a:expr)+, $variant:expr) =>  {
        [ $( A { a: $a, b: $variant } )* ]
    }
}
const AS: [A; 1024] = generate_list!(1..1025i32, B::One);

这似乎至少有一个问题是,在范围表达式扩展为文本列表之前对宏进行了求值。

我不确定它是否惯用,但以下可能适用于您的用例:

#[派生(调试、复制、克隆)]
发布结构A{
a:i32,
b:b,
}
#[派生(调试、复制、克隆)]
发布枚举B{
一,,
二,,
}
常量fn gen_数组(偏移量:i32,b:b)->[A;N]{
设mut res=[A{A:offset,b};N];
设muti=0;
而i

我使用了
while
循环,因为
for
循环当前不允许在
const
上下文中使用,如图所示

上述将为偏移量为
0的
AS
生成42个值:

[
A{
答:0,,
b:一个,
},
A{
答:1,,
b:一个,
},
...
A{
a:41,
b:一个,
},
]

显示它生成的指令与手动写入的指令相同。

手动写入、使用build.rs或执行proc宏。我重新打开是因为a)我从未打算复制hammer。b) 我认为在2021年康斯特可能会有更好的答案fn@DenysSéguret您不能在常量fn中使用for循环,所以我认为我们不能使用while循环