Primitive Type reference1.0.0[]

Expand description

引用,共享和可变。

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

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

实际上,Option<&T> 与可为空但对齐的指针具有相同的内存表示形式,因此可以跨 FFI 边界传递。

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

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

&mut T 相同的引用类型可以将引用自由地强制为 &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

有关如何使用引用的更多信息,请参见 the book’s section on “References and Borrowing”

Trait 实现

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

&mut T 引用除了 CopyClone (以防止创建多个同时可变借用) 之外,还获得以下所有内容,以及以下内容,无论其引用的类型是什么:

如果基础 T 也实现了 trait,则在 &T 上实现以下 traits:

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

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