[T; n]
是一个长度数组n
,表示为n
邻近的T
实例。
&[T; n]
纯粹是对该数组的引用,表示为指向数据的瘦指针。
[T]
是一个切片,一个未调整大小的类型;它只能通过某种形式的间接使用。
&[T]
,称为切片,是一种大小类型。它是胖指针,表示为指向第一项的指针和切片的长度。
因此,数组的长度在编译时就已知,而切片长度是运行时的问题。目前,数组在 Rust 中是二等公民,因为不可能形成数组泛型。有各种特征的手动实现[T; 0]
, [T; 1]
, &c.,通常最多 32 个;由于这个限制,切片的用途更加广泛。事实是&[T; n]
可以强迫&[T]
这是让他们可以忍受的方面。
有一个实现fmt::Debug
for [T; 3]
where T
实施Debug
,另一个为&T
where T
实施fmt::Debug
,所以如u8
实施Debug
, &[u8; 3]
也是如此。
Why can &[T; n]
强迫&[T]
?在 Rust 中,强制什么时候发生?
它会在需要时进行强制,而不会在其他时候进行。我能想到两种情况:
- 当某事期望
&[T]
你给它一个&[T; n]
它会默默地强迫;
- 你打电话时
x.starts_with(…)
on a [T; n]
它将观察到没有这样的方法[T; n]
,所以 autoref 开始发挥作用,它尝试&[T; n]
,这没有帮助,然后强制开始发挥作用,它会尝试&[T]
,它有一个名为starts_with
.
片段[1, 2, 3].starts_with(&[1, 2])
展示了两者。