切片与数组的比较如何在Rust中工作?

sa_*_*___ 1 arrays slice rust

为什么甚至[1,1] == &[1,1]不编译(可能是因为它们是不同的类型),但下面的代码片段编译并运行正常.

let a: [i32; 100] = [1; 100];
let b: &[i32] = &a[1..3];
if b == [1, 1] { // comparison with &[1, 1] works as well
    println!("it works"); // this does get printed
}
Run Code Online (Sandbox Code Playgroud)

red*_*ime 5

现在,Rust中的数组有点特殊,因为Rust缺少类型级整数.你不能写一个函数fn f<T, N>(array: &[T; N]).同样,您无法实现通用的特征N.

标准库为数组长度提供了一些特征实现,范围从0到32,以缓解此问题,这就是为什么b == [1,1]有效.PartialEq这个案例有一个特征的实现:

impl<'a, 'b, A, B> PartialEq<[A; 2]> for &'b [B] 
where B: PartialEq<A>
Run Code Online (Sandbox Code Playgroud)

但是,这个特性PartialEq<&[A; 2]>没有实现[B; 2].因此你无法比较[1, 1]&[1, 1].b == [1; 33]也不会在你的例子中工作,因为没有超过32个元素的数组的实现.

但是正在努力将类型级整数引入Rust.RFC 2000是最新的提案.

目前,您可以依赖从引用到数组的隐式转换来引用切片.像这样

fn f<T>(slice: &[T]) {}

f(&[1, 2, 3, 4]);
Run Code Online (Sandbox Code Playgroud)