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

标签 arrays rust slice

为什么 [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/

相关文章:

rust - 在GStreamer管道中将tee的单个分支延迟n秒

iterator - 为什么要连接我的迭代器中的字符串?

rust - 为什么我不能在特定的生命周期内实现 Deref?

java - 菜单驱动的 Java 可在 3 个类别之间进行选择。如何将所有这些类合并到一个类中?

java - 在java中正确地将字符串数组转换为字符串并返回

php - 在数组数组中查找级别数量的算法

pointers - Go Pointers - 通过指针将值附加到 slice

python - 切片 Pandas 数据帧非单调索引

dictionary - 为什么 slice 值有时会过时但永远不会映射值?

相当于 PHP $array[$i][] 的 JavaScript