在Rust中,如何比较切片和数组?

3
为什么 [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
}
1个回答

7

目前,Rust中的数组有点特殊,因为Rust缺乏类型级整数。你不能编写一个函数fn f<T, N>(array: &[T; N])。同样,你也不能实现一个泛型于N的trait。

标准库提供了一些针对长度从0到32的数组的trait实现来缓解这个问题,这就是为什么b == [1,1]可以工作的原因。对于这种情况,有一个PartialEq trait的实现:

impl<'a, 'b, A, B> PartialEq<[A; 2]> for &'b [B] 
where B: PartialEq<A>

然而,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]);

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