【Rust】04-借用、引用与切片

借用、引用与切片

学习目标

  • 理解借用解决了什么问题。
  • 区分不可变引用和可变引用。
  • 掌握字符串切片和数组切片的基本用法。

为什么需要借用

如果函数只是读取一个值,不应该夺走它的所有权。引用允许我们"借用"一个值:

rust 复制代码
fn main() {
    let name = String::from("Rust");
    print_name(&name);
    println!("{name}");
}

fn print_name(value: &String) {
    println!("{value}");
}

&name 创建了一个不可变引用。函数参数 &String 表示借用一个 String,不拥有它。

不可变引用

不可变引用允许读取,不允许修改:

rust 复制代码
fn main() {
    let text = String::from("hello");
    let len = length(&text);

    println!("{text}: {len}");
}

fn length(value: &String) -> usize {
    value.len()
}

同一时间可以有多个不可变引用:

rust 复制代码
let value = String::from("hello");
let r1 = &value;
let r2 = &value;
println!("{r1}, {r2}");

可变引用

如果需要通过引用修改值,变量本身和引用都要标记为可变:

rust 复制代码
fn main() {
    let mut text = String::from("hello");
    append_world(&mut text);

    println!("{text}");
}

fn append_world(value: &mut String) {
    value.push_str(", world");
}

同一时间只能有一个可变引用:

rust 复制代码
let mut value = String::from("hello");
let r1 = &mut value;
// let r2 = &mut value; // 编译错误
println!("{r1}");

这个规则防止数据竞争和意外修改。

引用规则

Rust 引用规则可以简化为:

  1. 可以有多个不可变引用。
  2. 或者有一个可变引用。
  3. 不可变引用和可变引用不能同时活跃。
  4. 引用不能比被引用的值活得更久。

示例:

rust 复制代码
fn main() {
    let mut value = String::from("hello");

    let r1 = &value;
    println!("{r1}");

    let r2 = &mut value;
    r2.push_str("!");
    println!("{r2}");
}

这段代码可以通过,因为 r1 在 println! 后不再使用。Rust 的非词法生命周期分析能识别这种情况。

字符串切片

字符串切片 &str 表示字符串中的一段视图:

rust 复制代码
fn main() {
    let text = String::from("hello world");
    let hello = &text[0..5];
    let world = &text[6..11];

    println!("{hello}, {world}");
}

更常见的函数参数写法是 &str,因为它既能接收 String 的切片,也能接收字符串字面量:

rust 复制代码
fn print_text(text: &str) {
    println!("{text}");
}

fn main() {
    let owned = String::from("owned string");
    print_text(&owned);
    print_text("string literal");
}

数组切片

数组或 Vec<T> 也可以切片:

rust 复制代码
fn main() {
    let numbers = [1, 2, 3, 4, 5];
    let middle = &numbers[1..4];

    println!("{middle:?}");
}

切片不拥有数据,只是引用连续的一段元素。

常见误区

  • &String 通常可以改成更通用的 &str。
  • 可变引用不是"更强的引用",而是带有独占访问要求。
  • 字符串切片索引按字节计算,切到 UTF-8 字符中间会 panic。
  • 引用不释放数据,所有者离开作用域时才释放。

练习

  1. 写一个函数接收 &str,返回字符串长度。
  2. 写一个函数接收 &mut String,在末尾追加感叹号。
  3. 对数组 [10, 20, 30, 40, 50] 创建一个包含中间三个元素的切片并打印。

后记

2026年6月10日17点11分于上海。

相关推荐
wespaul6 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
驭渊的小故事6 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
一只鹿鹿鹿11 小时前
政务外网整体设计方案(PPT)
大数据·数据库·web安全·系统安全·流程图·政务
哦虎!11 小时前
【JavaEE】网络初识
java
2603_9651481111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
for_ever_love__12 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
AI砖家12 小时前
安全进入 Agent Loop:2027 年 Coding Agent 的决胜点
数据库·安全·codex·vibecoding
wangqiaowq12 小时前
SQL server C盘空间占满的处理
数据库·sql
文人sec12 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
数字新视界12 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统