如何在Rust中指定全局范围内的const数组?

Ole*_*sky 33 arrays static literals rust

当我尝试使用以下代码在全局范围中添加const数组时:

static NUMBERS: [i32] = [1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: mismatched types:
 expected `[i32]`,
    found `[i32; 5]`
(expected slice,
    found array of 5 elements) [E0308]

static NUMBERS2: [i32] = [1, 2, 3, 4, 5];
                         ^~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我发现处理这个问题的唯一方法是在类型中指定长度:

static NUMBERS: [i32; 5] = [1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?应该可以创建一个数组而无需手动计算其元素.

Chr*_*gan 37

[T; N]在大多数情况下,使用是正确的方法; 这样就没有任何拳击价值.还有另一种方法,但是,这也是有时是有用的,尽管它稍微效率较低(由于指针间接): &'static [T].在你的情况下: -

static NUMBERS: &'static [i32] = &[1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在寻找使用字符串执行此操作的方法:http://stackoverflow.com/a/32383866/1349450 (7认同)
  • @RobertoLeinardi:从你的评论来看,我怀疑你可能误解了某些东西。Clippy 会说的是,如果你*消除*静态中的生命周期,它会推断出“静态”——这是自从我第一次写答案以来的新事物,当时你无法消除静态中的生命周期。但是“static”是静态中唯一可能的生命周期,因为它们存储在二进制文件的只读存储器中,并且必须永远存在。但对于这个问题和答案,生命周期有点转移注意力。关键是数组和切片之间的区别。 (2认同)

Grz*_*ski 10

您可以使用const它,这是一个示例:

const NUMBERS: &'static [i32] = &[1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)