创建长度相同的数组

4

我正在使用lodepng-rust编写一个生成图像的程序,希望使用像素而不是。我已经创建了一个结构体。

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}
const pixel_count: usize = 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_eq!(pixel_data.len()*3, data.len());
}
1个回答

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

你可能想把 pixel_number 改成 pixel_count,这样它们就匹配了。 无论如何,使用 assert! 让我使用的方法完美了,谢谢! - porglezomp
这在0.12.0中不再起作用了。你知道那是有意为之吗? - DrYap
@DrYap 确实,已经改变了,关键字现在是 const。谢谢! - Levans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接