Primitive Type reference1.0.0[−]
Expand description
引用,共享和可变。
引用代表某种拥有值的借用。您可以通过在值上使用 &
或 &mut
运算符,或者使用 ref
或 ref 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
引用除了 Copy
和 Clone
(以防止创建多个同时可变借用) 之外,还获得以下所有内容,以及以下内容,无论其引用的类型是什么:
如果基础 T
也实现了 trait,则在 &T
上实现以下 traits:
std::fmt
中的所有 traits (Pointer
和fmt::Write
除外)PartialOrd
Ord
PartialEq
Eq
AsRef
Fn
(此外,如果使用T: Fn
,则引用&T
和FnOnce
)Hash
ToSocketAddrs
&mut T
引用如果 T
实现了 trait,则获得除 ToSocketAddrs
之外的所有上述内容:
AsMut
FnMut
(此外,如果T: FnMut
引用&mut T
,则获得FnOnce
)fmt::Write
Iterator
DoubleEndedIterator
ExactSizeIterator
FusedIterator
TrustedLen
Send
(请注意,如果使用T: Sync
,则&T
引用仅获得Send
)io::Write
Read
Seek
BufRead
请注意,由于采用了调用解引用强制多态方法,只需调用 trait 方法就可以像处理引用一样,也可以使用其拥有的值! 这里描述的实现是针对泛型上下文的,其中最终类型 T
是类型参数或本地未知。