【问题标题】:How to specify const array in global scope in Rust?如何在 Rust 的全局范围内指定 const 数组?
【发布时间】:2014-07-11 16:19:31
【问题描述】:

当我尝试使用此代码在全局范围内添加一个 const 数组时:

static NUMBERS: [i32] = [1, 2, 3, 4, 5];

我收到以下错误:

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

static NUMBERS2: [i32] = [1, 2, 3, 4, 5];
                         ^~~~~~~~~~~~~~~

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

static NUMBERS: [i32; 5] = [1, 2, 3, 4, 5];

有没有更好的方法?应该可以在不手动计算元素的情况下创建数组。

【问题讨论】:

  • 如果您正在寻找一些关于为什么 Rust 是这样设计的讨论,请参阅this forum thread。
  • 如果你想写成const,最好写成:const NUMBERS: [i32; 5] = [1, 2, 3, 4, 5];

标签: arrays static literals rust


【解决方案1】:

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

const NUMBERS: &'static [i32] = &[1, 2, 3, 4, 5];

【讨论】:

    【解决方案2】:

    在大多数情况下,使用[T; N] 是正确的方法;这样一来,根本就没有价值的装箱。不过,还有另一种方法,有时也很有用,尽管效率稍低(由于指针间接):&'static [T]。在你的情况下:—

    static NUMBERS: &'static [i32] = &[1, 2, 3, 4, 5];
    

    【讨论】:

    • 如果您正在寻找一种使用字符串的方法:stackoverflow.com/a/32383866/1349450
    • clippy 告诉我“静态变量默认具有 'static 生命周期”
    • @RobertoLeinardi:从你的评论来看,我怀疑你可能误解了一些东西。 Clippy 会说的是,如果你在静态中省略生命周期,它会推断出'static——这是我第一次写答案以来的新事物,你不能在静态中省略生命周期那时。但是'static 是静态中唯一可能的生命周期,因为它们存储在二进制文件的只读内存中,并且必须永远存在。但是关于这个问题和答案,生命有点像红鲱鱼。关键是数组和切片的区别。
    • 我怎样才能创建一个大的静态矩阵?在 c++11 中的示例我可以写 static constexpr int my_arr[64][64]{ {13,44...},{..}.... }
    • @gekomad:Rust 中的类型组合更加明智:数组是[T; N],值是[…],因此您可以通过简单的嵌套使它们成为多维的,例如static MY_ARR: [[i32; 64]; 64] = [[13, 44, …], […], …];。 (此外,您的评论与此处的问题几乎没有关系,请针对此类问题提出新问题 - 或搜索,它可能已经回答了。)
    猜你喜欢
    • 2018-01-16
    • 2016-04-07
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多