Primitive Type reference

1.0.0 ·
Expand description

参考,&T&mut T

引用代表某种拥有值的借用。您可以通过在值上使用 &&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 是类型参数或本地未知。

Trait Implementations§

source§

impl<A, B: ?Sized> PartialEq<&B> for &Awhere A: PartialEq<B> + ?Sized,

source§

fn eq(&self, other: &&B) -> bool

此方法测试 selfother 值是否相等,并由 == 使用。
source§

fn ne(&self, other: &&B) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
source§

impl<A, B: ?Sized> PartialEq<&B> for &mut Awhere A: PartialEq<B> + ?Sized,

source§

fn eq(&self, other: &&B) -> bool

此方法测试 selfother 值是否相等,并由 == 使用。
source§

fn ne(&self, other: &&B) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
source§

impl<A, B: ?Sized> PartialEq<&mut B> for &Awhere A: PartialEq<B> + ?Sized,

source§

fn eq(&self, other: &&mut B) -> bool

此方法测试 selfother 值是否相等,并由 == 使用。
source§

fn ne(&self, other: &&mut B) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
source§

impl<A, B: ?Sized> PartialEq<&mut B> for &mut Awhere A: PartialEq<B> + ?Sized,

source§

fn eq(&self, other: &&mut B) -> bool

此方法测试 selfother 值是否相等,并由 == 使用。
source§

fn ne(&self, other: &&mut B) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
source§

impl<A, B: ?Sized> PartialOrd<&B> for &Awhere A: PartialOrd<B> + ?Sized,

source§

fn partial_cmp(&self, other: &&B) -> Option<Ordering>

如果存在,则此方法返回 selfother 值之间的顺序。 Read more
source§

fn lt(&self, other: &&B) -> bool

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more
source§

fn le(&self, other: &&B) -> bool

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more
source§

fn gt(&self, other: &&B) -> bool

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more
source§

fn ge(&self, other: &&B) -> bool

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more
source§

impl<A, B: ?Sized> PartialOrd<&mut B> for &mut Awhere A: PartialOrd<B> + ?Sized,

source§

fn partial_cmp(&self, other: &&mut B) -> Option<Ordering>

如果存在,则此方法返回 selfother 值之间的顺序。 Read more
source§

fn lt(&self, other: &&mut B) -> bool

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more
source§

fn le(&self, other: &&mut B) -> bool

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more
source§

fn gt(&self, other: &&mut B) -> bool

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more
source§

fn ge(&self, other: &&mut B) -> bool

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more
source§

impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T

source§

impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b mut T

source§

impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a mut U> for &'a mut T

source§

impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<&'a U> for &'a T

source§

impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<&'a mut U> for &'a mut T