繁体   English   中英

在Rust中如何将切片与数组进行比较?

[英]How does comparison of a slice with an array work in 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
}

目前,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]> PartialEq<&[A; 2]>未针对[B; 2] [B; 2] 因此,您无法比较[1, 1]&[1, 1] b == [1; 33] b == [1; 33]在您的示例中也不起作用,因为没有实现长度超过32个元素的数组。

但是,人们正在努力将类型级整数引入Rust。 RFC 2000是最新建议。

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

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

f(&[1, 2, 3, 4]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM