为什么[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
}
答案 0 :(得分: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>
但是,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]);