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

  • 本文关键字:参数 函数 数组 Rust rust
  • 更新时间 :
  • 英文 :


我们有一个带有两个向量的函数。我们希望确保两个向量的长度相同。有没有一种方法可以在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);
}

您可以使用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
}

最新更新