【问题标题】:Confusion between [T] and &[T][T] 和 &[T] 之间的混淆
【发布时间】:2020-01-08 13:27:23
【问题描述】:

我目前对 Rust 中的 [T]&[T] 感到困惑。让我们从我所知道的开始:

  • [T; n] 是一个包含 n 个元素的数组,
  • &[T; n] 是指向具有 n 个元素的数组的指针,
  • [T] 未调整大小并指向元素序列T,而
  • &[T] 是一个固定大小的胖指针,指向一系列元素 T

我的困惑始于这两个项目的命名约定。从documentation of Rust,他们提供了以下示例:

let a: [i32; 5] = [1, 2, 3, 4, 5]; // An array of type [T, n]
let slice: &[i32] = &a[1..3]; // A slice of type &[T]

和状态

这个切片的类型是 &[i32]。

所以,我假设&[T] 被称为切片[T] 的项目名称是什么? [T] 到底有什么用?您不能将它嵌入到结构中(它是未调整大小的),出于同样的原因,您不能在参数中采用这种类型。我无法弄清楚它的实际用法。

谢谢!

【问题讨论】:

  • 简单,let a = [1, 2, 3, 4, 5]; 不是[T],它是一个数组[T; 5]。你不能构造一个[T]
  • 嘿!谢谢你的评论。我了解数组类型 ([T, n])。我的问题实际上是关于切片类型的。
  • 简单地说,两者都是切片,但你不能构造一个[T],因为它没有大小。要获得可用的切片,您需要在某处进行间接寻址 &[T]
  • 人们不会用任何名字称呼[T],因为它本身几乎从来没有用过。

标签: arrays rust slice


【解决方案1】:

[T] 的项目名称是什么? [T]到底有什么用?

[T] 是一块连续的内存,填充了T 类型的项目。它很少直接通过名称来引用,因为它需要在指针后面才有用。这通常是&[T],通常称为切片,但也可以是其他指针类型。

“切片”这个词用得太多了,但它通常不会引起混淆,因为它实际上并没有太多出现。一般来说,如果单独使用“切片”这个词,那么它的意思是&[T]。如果它有其他修饰符,那么它可能指的是不同的指针类型。例如,Box<[T]>"boxed slice"Rc<[T]> 可能被称为“引用计数切片”。

【讨论】:

  • 感谢您的解释!我现在对[T] 背后的内容有了更好的可视化。 [T] 是一块连续的内存有助于理解类型背后的内容。在考虑这两种类型的应用案例时,我会说对于字符串(使用可执行文件编译),[T] 将对应于存储在程序只读段中的原始字符串字符,而&[T] 是一个胖指针,它包含一个指向字符序列及其长度的指针(实际上,Rust 使用 str 处理字符串 [T]&str 处理 &[T])。
  • 我建议对[T] 使用“裸切片”来区别&[T],因为两者通常都称为“切片”。
  • 嘿@SvenMarnach 和@trentcl,感谢您的反馈。有趣的是,您提供的链接将切片定义为表示为指针和长度的内存块的视图,它对应于胖指针&[T][T] 未调整大小)。此外,文档指出:共享切片类型为&[T],而可变切片类型为&mut [T],这是标准在 Rust 中调用引用的约定。对[T] 使用术语bare slice 将使这些名称明确。
【解决方案2】:

关于切片:

例如字符串字面量是 &str 类型的切片。但是字符串切片(String 类型)也属于 &str 类型,例如 slice: &str = &String [0..n-1]

此外,切片:&[T] in:

  • array: [T; n] 这样的数组——如果你想要其中的一部分,你可以取一个slice = &array [1..n-1],这意味着切片的类型是&[T]。

  • 向量如vector: Vec<T>你可以把它的一部分当作切片:&[T]。

【讨论】:

  • “切片是存储在堆栈中的一条信息,引用数据。”,切片可以装箱没有问题,不需要在堆栈上。
  • @Stargateur 我的意思是,由于切片是引用,切片本身 &[T] 位于指向堆中存储的堆栈上。当你有 Box 时,[T] 是一块连续的内存,而不是一个切片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2016-09-07
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多