2014-10-02 74 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