我正在写一些用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());
}
答案 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());
}