Primitive Type reference
1.0.0 ·Expand description
参考,&T
和 &mut T
。
引用代表某种拥有值的借用。您可以通过在值上使用 &
或 &mut
运算符,或者使用 ref
或 ref 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,无论其引用的类型是什么:
Copy
Clone
(请注意,如果存在的话,这不会遵循T
的Clone
实现!)Deref
Borrow
fmt::Pointer
&mut T
引用除了 Copy
和 Clone
(防止创建多个同时借用) 之外的所有内容,加上以下内容,无论其所指对象的类型如何:
如果底层 T
也实现了该 trait,则在 &T
引用上实现以下 traits:
std::fmt
中的所有 traits,除了fmt::Pointer
(无论其引用对象的类型是什么,它都被实现) 和fmt::Write
PartialOrd
Ord
PartialEq
Eq
AsRef
Fn
(另外,&T
引用FnMut
和FnOnce
如果T: Fn
)Hash
ToSocketAddrs
Send
(&T
引用也需要T: Sync
)Sync
&mut T
引用获得除 ToSocketAddrs
之外的所有上述内容,加上以下内容,如果 T
实现了 trait:
AsMut
FnMut
(另外,如果T: FnMut
,&mut T
引用得到FnOnce
)fmt::Write
Iterator
DoubleEndedIterator
ExactSizeIterator
FusedIterator
TrustedLen
io::Write
Read
Seek
BufRead
请注意,由于采用了调用解引用强制多态方法,只需调用 trait 方法就可以像处理引用一样,也可以使用其拥有的值! 这里描述的实现是针对泛型上下文的,其中最终类型 T
是类型参数或本地未知。