✅ 一、基本概念

& 就是创建一个引用(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);
  • 你还不能把书带回家卖掉(转移所有权),只能读一读。