Primitive Type reference1.0.0[]

Expand description

引用,包括共享引用和可变引用。

引用代表某种拥有值的借用。您可以通过在值上使用 &&mut 运算符,或者使用 refref mut 模式。

对于那些熟悉指针的人来说,引用只是一个被认为是对齐的指针,而不是空的,并且指向包含有效值 T 的内存 – 例如, &bool 只能指向包含整数值 1 (true) 或 0 (false) 的分配,但创建一个 &bool 指向包含值 3 的分配会导致未定义的行为。

事实上,Option<&T> 与可为空但已对齐的指针具有相同的内存表示,并且可以像这样跨 FFI 边界传递。

在大多数情况下,引用可以像原始值一样使用。字段访问,方法调用和索引工作相同 (当然,要保留可变性规则)。另外,比较运算符透明地遵从引用对象的实现,从而允许将引用与拥有的值进行比较。

引用具有附加的生命周期,代表借用有效的作用域。如果一个生命周期的代表作用域与另一个生命周期一样长或更长,则将其称为 “outlive”。'static 生命周期是最长的生命周期,它代表程序的总生命周期。 例如,字符串字面量具有 'static 生命周期,因为文本数据嵌入到程序的二进制文件中,而不是嵌入在需要动态管理的分配中。

&mut T 引用可以自由强制转换为 &T 引用类型相同的引用,生命周期较长的引用可以自由强制转换为较短的引用。

通过地址引用相等,而不是比较所指向的值,是通过 ptr::eq 通过隐式引用指针强制和裸指针相等来实现的,而 PartialEq 则是对值进行比较。

use std::ptr;

let five = 5;
let other_five = 5;
let five_ref = &five;
let same_five_ref = &five;
let other_five_ref = &other_five;

assert!(five_ref == same_five_ref);
assert!(five_ref == other_five_ref);

assert!(ptr::eq(five_ref, same_five_ref));
assert!(!ptr::eq(five_ref, other_five_ref));
Run

有关如何使用引用的更多信息,请参见 本书的 “References and Borrowing” 章节

trait 实现

对于所有 &T 都实现了以下 traits,无论其引用的类型是什么:

&mut T 引用除了 CopyClone (防止创建多个同时借用) 之外的所有内容,加上以下内容,无论其所指对象的类型如何:

如果底层 T 也实现了该 trait,则在 &T 引用上实现以下 traits:

&mut T 引用获得除 ToSocketAddrs 之外的所有上述内容,加上以下内容,如果 T 实现了 trait:

请注意,由于采用了调用解引用强制多态方法,只需调用 trait 方法就可以像处理引用一样,也可以使用其拥有的值! 这里描述的实现是针对泛型上下文的,其中最终类型 T 是类型参数或本地未知。