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

Yuc*_*ong 3 rust

我们有一个带有两个向量的函数。我们想确保两个向量的长度相同。有没有办法从 Rust 的类型级别强制执行这一点?

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

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

我们真正想要的是这样的:

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

    println!("{:?}", nums1);
    println!("{:?}", nums2);
}
Run Code Online (Sandbox Code Playgroud)

我们希望它们具有相同的长度,但它们可以是任意长度。上面的方法工作得很好,但是,它是运行时检查而不是编译时检查。

有没有办法在编译时使用一些 Rust 泛型、宏或任何黑魔法来实现这一点?

# N to be any integer larger than 1
fn baz(nums1: [i32; N], nums2: Vec<[i32; N]>) {
    println!("{:?}", nums1);
    println!("{:?}", nums2);
}
Run Code Online (Sandbox Code Playgroud)

Tob*_* S. 5

您可以使用const 泛型

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
}
Run Code Online (Sandbox Code Playgroud)