Improved Ch15

This commit is contained in:
Unisko PENG 2023-05-05 17:40:58 +08:00
parent ac3fb4fe5f
commit 73d802eaff

View File

@ -2,13 +2,13 @@
**Smart Pointers**
所谓 *指针* a *pointer*),即包含了内存中某个地址变量的一般概念。该地址引用了,或者说 “指向” 一个另外数据。Rust 中最常见的指针类别,便是在第 4 章中就曾了解过的引用。引用是以地址符号 `&` 所表示的,并借用了其所指向的那个值。除了对数据进行引用,以及没有开销外,他们并无什么特别的能力
所谓 *指针pointer*,是个一般的概念,指的是包含了内存中某个地址的变量。该地址引用,或者说 “指向” 另一数据。Rust 中最常见的指针类别,便是咱们在第 4 章中曾了解过的引用。引用由 `&` 符号表示,并借用他们指向的值。除了引用数据之外,他们没有任何特殊功能,并且没有开销
而另一方面的 *灵巧指针* *smart pointers*),则是些表现为指针,而同时有着额外元数据及能力的一些数据结构。灵巧指针这个概念,并非 Rust 所独有的:灵巧指针起源于 C++且在其他语言中也存在。Rust 有着定义在标准库中,提供了超出语言参考所提供到功能的各种各样的灵巧指针。这里将检视灵巧指针的几个不同示例,包括一种 *引用计数**reference counting* 的灵巧指针类型,来探索这个一般概念。引用计数这个指针,通过追踪数据所有者的数目,实现了允许数据有着多个所有者,在没有所有者剩下时,就清除该数据。
另一方面,*灵巧指针smart pointer* 是一种数据结构,其作用类似于指针,但还具有额外的元数据与能力。灵巧指针这个概念,并非 Rust 所独有的:灵巧指针起源于 C++且在其他语言中也存在。Rust 在标准库中定义了各种智能指针,他们提供了超越引用所提供的功能。为了探讨一般概念,我们将看几个不同的智能指针示例,包括 *引用计数reference counting* 智能指针类型。引用计数这种指针,通过追踪数据所有者的数目,实现了允许数据有着多个所有者,在没有所有者剩下时,就清除该数据。
具有所有权和借用概念下的 Rust在引用与灵巧指针之间就有了另外的区别引用只会借用数据而在许多情形下灵巧指针则 *拥有own* 他们所指向的数据。
鉴于 Rust 所有权和借用的概念Rust 在引用和智能指针之间还有一个区别:引用只借用数据,而在很多情况下,灵巧指针则 *拥有own* 他们所指向的数据。
尽管此时这里尚未像这样调用到他们,但本书中已经遇到过少数几个灵巧指针了,就包括第 8 章中的 `String``Vec<T>`。这两种类型之所以被算作灵巧指针,是由于他们拥有一些内存,同时允许咱们操纵那些内存。他们还有着元数据与额外能力或一些保证。比如,`String` 就将其容量存储为元数据,并有着确保其数据始终是有效 UTF-8 的额外能力
虽然我们当时没有这样称呼它们,但在本书中我们已经遇到了一些智能指针,包括第 8 章中的 `String``Vec<T>`。这两种类型都算作灵巧指针,因为他们拥有一些内存,并允许咱们对其进行操作。他们也有元数据和额外的能力或保证。例如,`String` 将其容量存储为元数据,并有额外的能力来确保其数据将永远是有效的 UTF-8
灵巧指针通常是使用结构体实现的。不同于寻常结构体,灵巧指针实现了 `Deref``Drop` 特质。`Deref` 特质允许该灵巧指针结构体的实例,像引用那样行事,如此咱们就可以编写出使用引用或灵巧指针的代码。而那个 `Drop` 特质,则允许对在该灵巧指针超出作用域时,要运行的代码加以定制。本章中,就会讨论这两种特质,并演示他们为何对灵巧指针是重要的。