创建长度相同的数组

时间:2014-10-02 03:58:51

标签: arrays rust compile-time

我正在写一些用lodepng-rust写的图像,我想用像素而不是u8来处理。我创建了一个结构

struct Pixel {r: u8, g: u8, b: u8}

我正在从数组的元素中构建一个u8的数组。由于我现在手工制作阵列,我还需要手工制作另一个阵列的奇怪情况。有没有办法在编译时创建一个像素阵列长度的三倍的数组?像

这样的东西
let data: [u8, ..other_array.len()*3];

哪个不起作用,因为.len()不是编译时常量。在这种情况下,运行时成本对我来说并不重要,但是如果我可以将相关尺寸相关联,那么它会感觉更清洁(我将来可能需要性能)。

修改 我使用的解决方案基于Levans的答案。 对于没有手动初始化数组的人,只需按照Levans。我手动初始化我的第一个数组,但是将类型设置为使用pixel_count中指定的长度,以便它可以使用在编译时捕获错误的pixel_count。我使用该常量创建第二个数组,然后断言长度具有正确的比率。我的最小例子如下所示:

struct Pixel {r: u8, g: u8, b: u8}
static pixel_count : uint = 4;

fn main() {
    let pixel_data = [Pixel, ..pixel_count] = [
                      Pixel {r: 255, g: 0, b: 0},
                      Pixel {r: 0, g: 255, b: 0},
                      Pixel {r: 0, g: 0, b: 255},
                      Pixel {r: 0, g: 99, b: 99}
                     ];
    let mut data = [0u8, ..pixel_count*3];
    assert!(pixel_data.len()*3 == data.len());
}

1 个答案:

答案 0 :(得分:3)

创建与大小相关的数组的最简单方法是将初始大小存储为const项:它们是编译时常量:

const pixel_count: uint = 42;

struct Pixel { r: u8, g: u8, b: u8 }

fn main() {
    let pixels = [Pixel { r: 0, g: 0, b: 0 }, ..pixel_count];
    let raw_data = [0u8, ..pixel_count * 3];
    assert!(pixels.len() * 3 == raw_data.len());
}