在Rust函数参数中强制数组长度相同

3

我们有一个涉及两个向量的函数。我们希望确保这两个向量的长度相同。有没有一种方法可以在Rust的类型级别上强制执行这一点?

例如,这里我们保证输入向量num1num2的长度为4。

fn foo(nums1: [i32; 4], nums2: Vec<[i32; 4]>) {
    println!("{:?}", nums1);
    println!("{:?}", nums2);
}

我们真正想要的是:

fn bar(nums1: Vec<i32>, nums2: Vec<Vec<i32>>) {
    for row in &nums2 {
        assert!(nums1.len() == row.len());
    }

    println!("{:?}", nums1);
    println!("{:?}", nums2);
}

我们希望它们的长度相同,但它们可以是任何长度。以上代码当然可以正常工作,但这只是一个运行时检查,而非编译时检查。

是否有一种方法可以使用 Rust 的泛型、宏或其他黑科技在编译时实现此目标呢?

# N to be any integer larger than 1
fn baz(nums1: [i32; N], nums2: Vec<[i32; N]>) {
    println!("{:?}", nums1);
    println!("{:?}", nums2);
}
1个回答

5

您可以使用常量泛型

fn foo<const N: usize>(nums1: [i32; N], nums2: Vec<[i32; N]>) {
    println!("{:?}", nums1);
    println!("{:?}", nums2);
}

fn main() {
    foo([1, 2], vec![[1, 2], [1, 2]]);
    foo([1, 2, 3], vec![[1, 2], [1, 2]]);
    //                   ^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements
}

没想到这是可能的。谢谢! - Yuchen
我不知道你可以这样做,好信息! - Ivan Raul Sanchez Diaz

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