✅ 一、基本概念
&
就是创建一个引用(reference),而 Rust 中所说的 “借用(borrowing)”其实就是通过引用访问数据而不获取所有权。
所以:
&x
是语法上的“取引用操作”,它创建了一个引用。- 这个引用就代表一次“借用”。
✅ 二、什么是“引用”?
在 Rust 中,引用(reference) 是指向某个值的指针,但它不拥有这个值的所有权。引用有两种:
类型 | 含义 |
---|---|
&T |
不可变引用(共享借用) |
&mut T |
可变引用(独占借用) |
例如:
rust
let x = 5;
let r = &x; // r 是对 x 的不可变引用(借用)
此时,r
并没有“拿走” x
的所有权,只是“借来看一看”。
✅ 三、那什么是“借用”?
在 Rust 的语境中,“借用”就是通过引用使用一个值的行为。也就是说:
当你用
&x
创建一个引用时,你就“借用了”x
的值。
借用的核心规则是:
- 借用不能超出被借用对象的生命周期。
- 多个不可变借用可以共存。
- 可变借用必须独占,同一时间只能有一个。
所以,“借用”是一个语义层面的说法,而“引用”是一个语法/类型层面的概念。
✅ 四、例子说明
rust
fn main() {
let s = String::from("hello");
// 使用 &s 创建一个引用,也就是“借用了”字符串的内容
let len = calculate_length(&s);
println!("The length of '{}' is {}.", s, len);
}
// 接受一个借用(即引用)
fn calculate_length(s: &String) -> usize {
s.len()
}
在这个例子中:
&s
是一个引用。calculate_length
函数并没有获得s
的所有权,而是“借用了”它。- 所以我们在函数调用之后还可以继续使用
s
。
这就是典型的“借用”的场景。
✅ 五、再看切片的例子
rust
let arr = [1, 2, 3, 4, 5];
let slice = &arr[1..3]; // 这里是“借用”了数组的一部分
arr[1..3]
是[i32]
类型(DST),不能直接拥有。&arr[1..3]
创建了一个引用,即&[i32]
类型,这是一次“借用”。- 我们通过这个引用访问数组的部分内容,但不拥有它们。
✅ 六、总结:引用 vs 借用
术语 | 含义 | 关系 |
---|---|---|
引用 (&T ) |
语法结构,表示一个指针,不拥有所有权 | 引用是实现借用的方式 |
借用 | 语义概念,表示使用别人的数据而不拥有它 | 借用是引用的用途 |
引用是手段,借用是目的。
💡 类比生活中的例子:
想象你向朋友借一本书:
- “书”是你朋友拥有的数据;
- “借”是你的行为(借用);
- “借条”就是引用(
&book
); - 你还不能把书带回家卖掉(转移所有权),只能读一读。