mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2024-12-26 04:40:33 +08:00
Improved Ch15
This commit is contained in:
parent
ac3fb4fe5f
commit
73d802eaff
@ -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` 特质,则允许对在该灵巧指针超出作用域时,要运行的代码加以定制。本章中,就会讨论这两种特质,并演示他们为何对灵巧指针是重要的。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user