为什么 [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
}
最佳答案
现在,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]);
关于arrays - 切片与数组的比较在 Rust 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44351328/