2014-10-02 75 views
3

我正在写一些与lodepng-rust一起写图像的东西,我想使用像素而不是u8 s。我创建了一个结构创建相同长度的数组

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()); 
} 

回答

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()); 
} 
+0

你可能想把'pixel_number'变成'pixel_count',以便它们匹配。 无论如何,使用'assert!'使得我使用的方法非常完美,谢谢! – porglezomp 2014-10-03 01:35:15

+0

这不再适用于0.12.0。你知道这是故意吗? – DrYap 2014-11-20 23:00:10

+0

@DYYap事实上,它已经改变了,关键字现在是'const'。谢谢 ! – Levans 2014-11-20 23:28:39