【问题标题】:Create array with same length创建相同长度的数组
【发布时间】:2023-03-10 16:17:02
【问题描述】:

我正在使用 lodepng-rust 编写图像,我想使用像素而不是 u8s。我已经创建了一个结构

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

并且正在从数组的元素中构建一个u8s 数组。由于我现在正在手工制作阵列,所以我处于需要手工制作另一个阵列的奇怪情况。有没有办法在编译时创建一个长度是像素数组长度的三倍的数组?类似的东西

let data: [u8; other_array.len()*3];

这不起作用,因为.len() 不是编译时间常数。在这种情况下,运行时成本对我来说并不重要,但如果我能拥有相关的尺寸,它会感觉更干净(而且我将来可能需要性能)。

编辑: 我正在使用的解决方案是基于 Levans 的回答。 对于不手动初始化数组的人,请按照 Levans 进行操作。我手动初始化我的第一个数组,但将类型设置为使用 pixel_count 中指定的长度,这样它就会捕获错误的 @ 987654327@ 在编译时。我使用该常数创建第二个数组,然后断言长度具有正确的比率。我的最小示例如下所示:

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

【问题讨论】:

    标签: arrays rust compile-time


    【解决方案1】:

    创建与大小相关的数组的最简单方法是将初始大小存储为 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! 使我使用的方法完美,谢谢!
    • 这在 0.12.0 中不再有效。你知道这是不是故意的吗?
    • @DrYap 确实变了,关键字现在是const。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多