提问人:Humble Penguin 提问时间:6/19/2023 最后编辑:Chayim FriedmanHumble Penguin 更新时间:6/19/2023 访问量:124
[T], 和 [T] 之间的区别
Difference between [T], &[T]
问:
我想知道 a 和 a 之间的区别。我不明白未大小的类型是怎么回事,编译器不能通过源代码推断出切片的大小吗?slice ([T])
reference to a slice (&[T])
slices
我知道我们需要对切片的引用才能使其有用,但是,只有当我了解如何未调整大小时,这才有意义。slices
此外,我想知道 和 之间的区别。我知道一个是切片,另一个是对切片的引用,它存储了对字符串开头和长度的引用。但这让我感到困惑,为什么我们不能在没有参考的情况下单独使用。为什么我们不能将大小存储在切片本身中。为什么我们需要引用它。我有 c++ 背景,所以也许使用 c++ 类型和术语可以解决问题!str
&str
&str
str
str
答:
5赞
Chayim Friedman
6/19/2023
#1
引用,或者只是一个指针(和一个长度)。这个指针指向哪里?它指向一些数据。此数据是切片本身的(或),即数据的实际字节。在C++中没有对应关系。&[T]
&str
[T]
str
由于数据可以是任意长度的,因此我们无法对 .我们不能把它作为一个参数,我们不能返回它,它总是必须用某种引用来包装。通常它是 或 ,但对于拥有的切片,它也可以是 或 或 。[T]
&
&mut
Box
Rc
Arc
有时,编译器可以推断切片大小(例如,当我们通过闭合常量范围进行切片时)。但切片类型从不对长度进行编码。只有在运行时对它的引用才会这样做。这是因为拥有一些可以具有任何运行时确定长度的数据很有用,例如 C++ 或 .std::span
std::string_view
评论
1赞
Humble Penguin
6/19/2023
切片类型本身在内存中的表示方式。我知道对切片的引用在内存中是如何表示的,但切片本身是如何表示的。您能否解释一下如何在内存中引用切片,以及拥有的切片提供了哪些好处。owned
1赞
Chayim Friedman
6/19/2023
@HumblePenguin 切片只是连续的字节,被解释为类型的重复。它就像一个数组,但长度未知。自有数组的好处是没有生存期,因此它可以自由传递并保存以备后用,就像任何自有类型一样 ( vs )。Box<T>
&mut T
0赞
rodrigo
6/20/2023
我会改写最后一条评论,说在内存中,切片与相同长度的数组相同。切片和数组之间的区别在于,对于后者,长度是其类型的一部分;而对于前者,长度从类型中删除,编译器不知道。
0赞
Humble Penguin
6/20/2023
不应该有这行代码:创建从第一个元素到第二个元素的数组副本。相反,我收到一个错误,告诉我它是未大小的。let slic = arr[..3];
arr
0赞
Chayim Friedman
6/20/2023
@HumblePenguin 否,因为索引到数组中会创建一个切片,即使索引是一个常量闭合范围。
评论