Rust 初学者指南,从安装到核心概念,帮你快速上手。
一、安装 Rust
bash
# 官方推荐方式(使用 rustup) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 验证安装 rustc --version cargo --version二、第一个程序
rust
// main.rs fn main() { println!("Hello, Rust!"); }bash
# 编译运行 rustc main.rs && ./main # 或用 Cargo(推荐) cargo new hello cd hello cargo run三、核心概念(Rust 的灵魂)
1. 变量与可变性
rust
let x = 5; // 不可变(默认) let mut y = 10; // 可变 y = 20; const MAX: u32 = 100; // 常量,必须标注类型 let z = 5 + 3; // 可以覆盖(shadowing) let z = "hello"; // 甚至可以改变类型2. 所有权(Ownership)—— Rust 最核心的机制
三条规则:
每个值都有一个所有者
同一时间只能有一个所有者
所有者离开作用域,值被自动释放
rust
fn main() { let s1 = String::from("hello"); // s1 拥有这个字符串 let s2 = s1; // 所有权转移给 s2(move) // println!("{}", s1); // ❌ 错误!s1 不再有效 let x = 5; let y = x; // ✅ 可以,因为 i32 实现了 Copy trait println!("x = {}, y = {}", x, y); }3. 借用(Borrowing)
不想转移所有权?用引用:
rust
fn main() { let s = String::from("hello"); let len = calculate_length(&s); // 不可变借用 println!("'{}' 长度是 {}", s, len); // ✅ s 还能用 change(&mut s); // 可变借用 } fn calculate_length(s: &String) -> usize { s.len() // 不获取所有权,只是借用 } fn change(s: &mut String) { s.push_str(", world"); }借用规则:
要么一个可变引用,要么多个不可变引用
引用必须始终有效(编译器检查,防止悬空指针)
4. 切片(Slice)
rust
let s = String::from("hello world"); let hello = &s[0..5]; // 字符串切片 let world = &s[6..11]; let arr = [1, 2, 3, 4, 5]; let slice = &arr[1..3]; // [2, 3]四、控制流
rust
let number = 6; if number % 4 == 0 { println!("能被4整除"); } else if number % 3 == 0 { println!("能被3整除"); } else { println!("都不行"); } // if 是表达式,可以返回值 let condition = true; let x = if condition { 5 } else { 6 }; // 循环 loop { // 无限循环 break; } while condition { // while 循环 } for i in 1..4 { // 1, 2, 3(推荐!) println!("{}", i); } let arr = [10, 20, 30]; for element in arr.iter() { println!("值: {}", element); }五、函数
rust
fn main() { let result = add(5, 3); println!("结果: {}", result); } // 参数类型必须标注,返回类型用 -> fn add(a: i32, b: i32) -> i32 { a + b // 表达式(无分号)就是返回值 }六、结构体与枚举
rust
// 结构体 struct User { username: String, email: String, sign_in_count: u64, active: bool, } let user1 = User { email: String::from("a@b.com"), username: String::from("alice"), active: true, sign_in_count: 1, }; // 元组结构体 struct Point(i32, i32, i32); // 枚举(非常强大!) enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32), } // Option:Rust 没有 null! let some_number = Some(5); let absent_number: Option<i32> = None; // Result:错误处理 enum Result<T, E> { Ok(T), Err(E), }七、模式匹配(match)
rust
enum Coin { Penny, Nickel, Dime, Quarter, } fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => { println!("Lucky penny!"); 1 } Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, } } // if let 简化版 let some_value = Some(3); if let Some(3) = some_value { println!("三"); }八、错误处理
rust
use std::fs::File; // Result 类型 let f = File::open("hello.txt"); match f { Ok(file) => file, Err(error) => panic!("打开文件失败: {:?}", error), } // 简写:? 运算符 fn read_username_from_file() -> Result<String, io::Error> { let mut f = File::open("hello.txt")?; // 失败时直接返回 Err let mut s = String::new(); f.read_to_string(&mut s)?; Ok(s) } // 更简 fn read_username_from_file() -> Result<String, io::Error> { fs::read_to_string("hello.txt") } // unwrap() / expect() —— 快速但不安全 let f = File::open("hello.txt").unwrap(); let f = File::open("hello.txt").expect("无法打开文件");九、集合类型
rust
// Vector let mut v = vec![1, 2, 3]; v.push(4); let third = &v[2]; // 可能 panic let third = v.get(2); // 返回 Option<&T> // String let mut s = String::from("foo"); s.push_str("bar"); let s2 = format!("{}-{}", s, "baz"); // HashMap use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert("Blue", 10); scores.entry("Yellow").or_insert(50); // 不存在才插入十、生命周期(Lifetimes)
rust
// 告诉编译器:返回的引用和参数活得一样久 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y } } // 结构体中的生命周期 struct ImportantExcerpt<'a> { part: &'a str, }十一、常用 Cargo 命令
bash
cargo new project_name # 创建新项目 cargo build # 编译 cargo build --release # 优化编译(生产环境) cargo run # 编译并运行 cargo check # 快速检查(不生成可执行文件) cargo test # 运行测试 cargo doc --open # 生成并打开文档 cargo add crate_name # 添加依赖十二、学习路线图
plain
第1周:变量、类型、函数、控制流 第2周:所有权、借用、切片(重点!) 第3周:结构体、枚举、模式匹配 第4周:集合类型、错误处理 第5周:生命周期、trait、泛型 第6周:闭包、迭代器、智能指针 第7周:并发编程( fearless concurrency ) 第8周:unsafe Rust、FFI推荐资源
表格
| 资源 | 说明 |
|---|---|
| The Rust Book | 官方教程,最权威 |
| Rustlings | 小练习,边做边学 |
| Rust by Example | 示例驱动 |
| Exercism Rust | 编程练习 |
Rust 的编译器很严格,但报错信息非常友好。拥抱编译器错误,它们是在帮你避免运行时 bug!