为什么每当我们在 rust 中创建切片时都需要一个参考符号

Why do we need a reference symbol whenever we create a slice in rust

提问人:Humble Penguin 提问时间:7/6/2023 最后编辑:Humble Penguin 更新时间:7/6/2023 访问量:82

问:

我对生锈切片的概念有点迷茫。我知道 [T] 是 T 类型元素的连续块,大小未知,我们需要一个指向该数据的指针才能访问它。我不明白的是,如果我们运行以下代码:

let slice: [u8] = arr[1..3];

编译器是否尝试从“arr”访问第一个和第二个元素并将其存储在堆栈中,但它无法做到这一点,因为它不知道大小,因此我们被迫使用如下指针从“arr”引用第一个和第二个元素:

let slice: [u8] = &arr[1..3];

其次,当文档说这句话时,我不明白这意味着什么slices are a view onto a contiguous block of memory

(切片类型)如何查看连续的内存块?(对切片的引用)不是对连续内存块的视图吗?str&str

我来自C++背景,所以看到字符串和切片如何在生锈中工作有点奇怪

评论

0赞 CoronA 7/6/2023
str不是一片,是。 不是切片类型,是。因为它们是连续内存块的视图。第一个操作不起作用,因为 的语义不是“给我一个数组的副本”(它只用前面的 定义,然后意味着“给我一个数组的视图”)。&str[u8,n]&[u8]arr[1..3]&
0赞 isaactfa 7/6/2023
问题不完全匹配,但这个答案解决了你所问的一切。
2赞 Chayim Friedman 7/6/2023
@CoronA,绝对是切片,但不是。它们是对切片的引用。文档中的术语存在一些混淆,但这是类型的名称。str[u8]&str&[u8]
1赞 Chayim Friedman 7/6/2023
它不编译,这就是发生的事情。
1赞 PatientPenguin 7/6/2023
它仍然引用原始数组。这个链接可能有助于解释这种混淆:stackoverflow.com/questions/27879161/...。另外,不相关但不错的用户名;)

答:

1赞 Chayim Friedman 7/6/2023 #1

其次,当文档说“切片是连续内存块的视图”时,我不明白这意味着什么

你是对的。这里的文档非常混乱。它谈论的是 slice 的引用,因为 slice 本身不是视图,正如我们可以通过 的存在来证明的那样。但是,虽然技术上准确的名称是“切片引用”(或“切片引用”、“切片引用”),但文档在许多地方使用术语“切片”来描述它。Box<[T]>&[T]

有一个开放的 GitHub 问题可以修复此处和其他地方的术语:#101353

评论

0赞 isaactfa 7/6/2023
引用分别将 、 和 称为“共享切片”、“可变切片”和“盒装切片”,尽管正如您提到的,这些名称没有出现在我所知道的任何官方文档中。&[T]&mut [T]Box<[T]>