
嗨呀宝贝们~今天 YuKi 想聊聊一个能让 C++ 老司机都怀疑人生的编程语言——Rust 🦀
如果你逛过 GitHub 或者 reddit,肯定见过这只小螃蟹。Rust 从 2015 年发布 1.0 以来,已经连续好几年蝉联 Stack Overflow **「最受喜爱语言」**第一名了。但很多人一上手就被编译器骂哭——「凭什么不让我写这行代码?!」🤣 别急,今天我们就来聊聊 Rust 到底好在哪、难在哪。
核心卖点:内存安全,不需要垃圾回收
C 语言的痛:你忘了 free,内存泄漏;你 free 早了,悬垂指针;你写了越界,程序崩给你看。C++ 引入了 RAII 和智能指针,但不强制使用——你依然可以用裸指针把自己炸飞。
Rust 的思路是:在编译期就杜绝所有内存错误。怎么做到的?靠三大法宝:
1. 所有权(Ownership)
Rust 最核心的规则就三条:
- 每个值都有一个「所有者」
- 同一时间只能有一个所有者
- 所有者离开作用域,值就被自动释放
let s1 = String::from("hello");let s2 = s1; // s1 的所有权转移给了 s2// println!("{}", s1); // ❌ 编译错误!s1 已经无效了这跟 C++ 的 std::move 有点像,但 Rust 默认就是移动语义,而且编译器会帮你检查。
2. 借用(Borrowing)
所有权太严格了怎么办?用引用:
fn print_len(s: &String) { // 不可变借用 println!("长度: {}", s.len());}
let s = String::from("hello");print_len(&s); // s 的所有权没有转移println!("{}", s); // ✅ s 仍然有效引用的黄金法则:同一时间,要么一个可变引用,要么多个不可变引用,不能同时存在。这条规则直接杜绝了数据竞争(data race)。
3. 生命周期(Lifetime)
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y }}生命周期标注 'a 告诉编译器:「返回的引用活得跟 x 和 y 一样长」。初学时会被生命周期绕晕,但它其实是编译器帮你做静态分析的工具——理解了之后反而觉得编译器像个贴心的老师 👩🏫
零成本抽象:快得像 C,写得像 Python
Rust 的另一个哲学:你不用的东西,不为你付出代价。
Iterator链式调用会被编译成和手写for循环一样的机器码async/await不依赖操作系统线程,用的是协作式调度- 没有运行时(runtime),可以写操作系统内核
一个经典的性能对比:用 Rust 写的 ripgrep(代码搜索工具)比用 C 写的 grep 还要快,而且是内存安全的。
生态和工具链
Rust 的包管理器 Cargo 被很多人认为是所有语言里最好用的:
cargo new my_project # 创建项目cargo build # 编译cargo run # 运行cargo test # 测试cargo fmt # 格式化代码cargo clippy # 代码检查一条命令搞定所有事情,不用配 CMake/autotools/npm/pip 那一大堆。
谁在用 Rust?
- Mozilla(Firefox 的 Servo 引擎)
- Amazon(AWS Lambda、Firecracker 虚拟机)
- Dropbox(文件同步引擎)
- Discord(从 Go 迁移到 Rust)
- Linux 内核(6.1 开始正式支持 Rust)
要不要学?
如果你已经在写 C/C++,Rust 会让你感觉「原来内存管理可以不用靠运气」;如果你写 Python/JS,Rust 能让你理解底层到底发生了什么。
学习曲线确实陡峭——借用检查器(borrow checker)是你的第一个 Boss。但一旦打败它,你会获得一种奇妙的自信:「编译器说能通过,我写的代码就没有内存bug」✨
YuKi 的建议是:先看 The Rust Book(免费在线),然后用 Rustlings 做小练习,最后找个感兴趣的项目实战一把~ 🦀💕