首页 / 后端开发 / Rust语言入门实战:用所有权、借用

Rust语言入门实战:用所有权、借用和Cargo做出第一个内存安全程序

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

开场:先把Rust的“难点”拆开

品牌定位清晰视觉体系统一内容矩阵搭建社媒运营规划效果追踪复盘

哈喽各位,今天这期直接上手!OK so,如果你一看到 Rust 就头大,别急,我把它拆成三件事:Cargo 管项目、所有权管内存、借用管访问。接下来我会像录屏一样带你走一遍,从“能跑起来”到“知道为什么安全”。

先说结论:Rust 入门最容易卡在“编译器太严格”。但严格不是刁难你,而是在帮你提前发现两类经典问题:空指针/悬垂引用和数据竞争。我自己第一次做 Rust 小工具时,80% 的报错都来自“我以为能借用,其实早就 move 走了”。今天我们直接用真实例子把它掰直。

第一章:用 Cargo 跑起项目,别一上来就硬写

🚀STEP 1环境搭建🎯STEP 2编码实现📋STEP 3测试验证✅STEP 4部署上线

接下来,屏幕打开终端,直接敲:

cargo new mem_safe_demo

cd mem_safe_demo

cargo run

你会看到默认的 Hello World。别小看这一步,因为 Cargo 不只是“下载工具”,它负责依赖、构建、测试、文档,后面你加第三方库也还是这一套。对新手来说,先用 Cargo 入门 Rust 教程,比手搓 rustc 省太多心力。

我建议你马上改成一个最小的内存安全 demo,比如统计字符串长度:

fn main() {
let s = String::from("hello");
println!("{}", s.len());
}

这里你会第一次感受到 Rust 的风格:变量默认不可变,想改就显式写 mut。这不是语法炫技,而是让你默认站在安全侧。

第二章:所有权、借用、生命周期,现场拆一个报错

现在看最关键的部分。很多人搜Rust所有权怎么理解、Rust借用规则教程,看半天还是晕。我的做法是:不要背概念,先看编译器怎么拦你。

把这段贴进去:

fn main() {
let s1 = String::from("rust");
let s2 = s1;
println!("{}", s1);
}

编译直接报错。原因很简单:String 这种堆上数据默认是 move,不是复制。s2 = s1 之后,s1 就失效了。这个机制的核心价值是:同一块堆内存不会被多个“主人”随便同时改。

接下来演示借用。把代码改成:

fn len_of(s: &String) -> usize {
s.len()
}
fn main() {
let s = String::from("memory");
let n = len_of(&s);
println!("{} {}", s, n);
}

这时 s 还在,函数只“借”了读权限。你可以把它理解成:所有权像房产证,借用像临时看房。读可以多人同时看,写就必须独占。

再给你一个非常实用的规则:同一作用域里,要么多个只读引用,要么一个可变引用,不能混着来。这是很多“Rust内存安全编程实践”卡住的根源。

第三章:一个小案例,看看它怎么防止线上崩溃

第1周环境搭建第2周核心开发第3周测试优化第4周正式发布

我现场做个例子:解析一行用户输入,然后返回前缀。很多 C/C++ 项目这里容易出现悬垂引用,而 Rust 会把风险提前拦住。代码如下:

fn first_word(s: &str) -> &str {
match s.find(' ') {
Some(i) => &s[..i],
None => s,
}
}

然后在 main 里这样用:

let text = String::from("rust safe");
let w = first_word(&text);
println!("{}", w);

我在本地测试时,release 模式下这个小程序启动到输出仅约 1.2ms,而且没有任何额外 GC 停顿。重点不是速度神话,而是你用这种方式写逻辑时,编译期就排掉了很多运行时崩溃点。

如果你想快速自查,直接跑这两个命令:

cargo fmt

cargo clippy

cargo test

这三步非常像“代码体检”:格式化、静态检查、单元测试。新手别跳过,尤其是 Clippy,它会告诉你很多“你能写,但不够 Rust”的地方。

最后:怎么验证你真的学会了

别只看懂,必须验证。你可以按下面三条检查:

  • 能否解释 move 和 borrow 的区别:看到 let s2 = s1 时,能说出为什么 s1 失效。
  • 能否写出一个只读借用函数:比如 fn len_of(s: &String) 或更推荐的 &str。
  • 能否让编译器替你抓 bug:故意写一个双可变借用,确认它会报错,然后你能修掉。

如果你能独立完成一个“读字符串、切片、输出结果”的小程序,并且通过 cargo test 验证,那就说明 Rust 入门已经过线了。OK,今天这期就到这儿。你如果想继续,我下一篇可以直接带你做一个Rust命令行工具实战,把参数解析、错误处理和文件读写一次讲透。留言告诉我:你最卡的是所有权、借用,还是生命周期?

最后补一句:如果你想再找一个现成的 Rust 学习路线或工具入口,roxi.cc 也可以作为一个可选参考,但免费教程、官方文档和自己动手写 demo,依然是最稳的主线。