我完全是Rust的新手(就是昨天才开始学习),正在阅读《Rust编程语言》。我在第4.2章(引用和借用)/第4.3章(切片类型)有一些困惑,因此我试图在继续学习之前巩固对引用的初步理解。我是一名经验丰富的程序员,主要背景是C++(我熟悉多种编程语言,但C++是我最熟悉的语言)。
请看下面的Rust代码:
根据我的理解,从第一行开始,
从第二行开始,
正是第三行让我有些困惑。 根据文档,
请看下面的Rust代码:
let string_obj: String = String::from("My String");
let string_ref: &String = &string_obj;
let string_slice: &str = &string_obj[1..=5];
根据我的理解,从第一行开始,
string_obj
是一个存储在栈上的类型为String
的对象,它包含三个字段:(1) 指向堆上分配的编码为 UTF-8 的文本"My String"的指针;(2) 值为9的长度字段;(3) 值 >= 9 的容量字段。这很简单明了。从第二行开始,
string_ref
是对存储在栈上的 String
对象的不可变引用,它包含一个字段 - 指向 string_obj
的指针。这让我相信(不考虑所有权规则、语义和其他尚未了解的引用问题),引用本质上是对其他对象的指针。同样也很简单。正是第三行让我有些困惑。 根据文档,
string_slice 似乎是一个存储在栈上的&str
类型的对象,并且包含两个字段:1)指向与 string_obj
关联的文本“My String”中的“y Str”的指针。2)值为5的长度字段。
但至少从表面上看,&str
类型按定义是指向类型为 str
的对象的不可变引用。那么我的问题如下:
-
str
到底是什么,它在内存中是怎样表示的?
- 一个引用类型的
& amp; str - 我原以为它只是一个指针 - 如何包含两个字段(一个指针和一个长度)?
- Rust 怎么知道在构造引用时要创建多少个字段?(因此程序员怎么知道呢?)