Rust基础知识入门

Rust 是一种系统级编程语言,以其安全性、速度和并发性而闻名。以下是一些 Rust 入门的关键知识点,以及具体的代码示例和详细说明:

Rust 语言概览与设计哲学

Rust 由 Mozilla 研究院的 Graydon Hoare 于 2010 年发起,2015 年发布 1.0 稳定版。它的设计目标是在 零成本抽象 的前提下,提供 内存安全 和 线程安全,同时保持与 C/C++ 相媲美的运行时性能。这意味着 Rust 不需要垃圾回收器(GC),编译期即可通过所有权(Ownership)、借用(Borrowing)和生命周期(Lifetime)机制消除空指针、悬垂指针、数据竞争等内存错误。

与 C++ 相比,Rust 在编译阶段就强制检查内存合法性;与 Go 相比,Rust 不提供 GC,更适合对延迟敏感的场景(如游戏引擎、操作系统内核、嵌入式开发)。Rust 连续 8 年蝉联 Stack Overflow 「最受开发者喜爱语言」榜首,其生态已覆盖 Web 后端(Actix/Axum)、CLI 工具(ripgrep/bat)、系统工具(Linux 内核模块)、区块链 (Solana/Polkadot)和 WebAssembly 等领域。


Rust基础知识入门

Rust 是一种系统级编程语言,以其安全性、速度和并发性而闻名。以下是一些 Rust 入门的关键知识点,以及具体的代码示例和详细说明:

  1. Hello World 程序:这是学习任何编程语言的第一步。在 Rust 中,程序的入口点是 main 函数。

    fn main() {
        println!("Hello, world!");
    }
    

    这段代码使用 println! 宏打印出 “Hello, world!” 到控制台。注意 Rust 中的宏以 ! 结尾 。

  2. 变量绑定:在 Rust 中,使用 let 来绑定变量。变量默认是不可变的,但可以使用 mut 关键字使其可变。

    let x = 5; // 不可变变量
    let mut y = 10; // 可变变量
    

    这里 x 是一个不可变变量,而 y 是可变的 。

  3. 数据类型:Rust 是一种静态类型语言,需要明确或让编译器推断变量的类型。

    let a: i32 = 20; // 显式指定类型
    let b = 20; // 编译器根据值推断类型
    

    i32 是一个有符号的 32 位整数类型 。

  4. 函数:定义函数使用 fn 关键字,函数可以返回值。

    fn add(a: i32, b: i32) -> i32 {
        a + b
    }
    

    这个 add 函数接受两个 i32 类型的参数并返回它们的和 。

  5. 控制流:Rust 提供了常见的控制流结构,如 if/else 和 loop。

    let condition = true;
    if condition {
        println!("Condition is true");
    } else {
        println!("Condition is false");
    }
    
  6. 结构体和枚举:用于创建自定义数据类型。

    struct Point {
        x: i32,
        y: i32,
    }
    
    enum Message {
        ChangeColor(i32, i32, i32),
        MoveCursor { x: i32, y: i32 },
    }
    

    这里定义了一个 Point 结构体和一个包含不同类型变体的 Message 枚举 。

  7. 错误处理:Rust 使用 Result 类型来处理可能失败的操作。

    fn divide(a: i32, b: i32) -> Result<i32, String> {
        if b == 0 {
            Err(String::from("Cannot divide by zero"))
        } else {
            Ok(a / b)
        }
    }
    

    这个 divide 函数在除数为零时返回 Err,否则返回 Ok 包装的商 。

  8. 模块和包管理:使用 mod 创建模块,使用 cargo 作为包管理器和构建系统。

    mod math_functions {
        pub fn add(a: i32, b: i32) -> i32 {
            a + b
        }
    }
    

    math_functions 模块包含一个公共函数 add 。

  9. 生命周期和借用:Rust 的所有权系统确保内存安全,避免数据竞争。

    fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
        if s1.len() > s2.len() {
            s1
        } else {
            s2
        }
    }
    

    这个 longest 函数展示了生命周期注解的使用 。

所有权系统深度解读

Rust 最核心的创新是所有权(Ownership)系统。在 Rust 中,每个值都有且只有一个所有者(变量),当所有者离开作用域时,值会自动被释放(调用 drop)。这种机制避免了 dangling pointer 和 double-free,无需运行时 GC。

所有权规则三原则:

  1. 每个值都有一个所有者
  2. 同一时间只能有一个所有者
  3. 当所有者离开作用域,值被丢弃
// 所有权转移(Move)
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权转移给 s2
// println!("{}", s1); // 编译错误!s1 已失效

// 借用(Borrowing)解决临时访问需求
fn greet(name: &str) {
    println!("Hello, {}!", name);
}
let s = String::from("Rust");
greet(&s); // 不可变借用
println!("{}", s); // s 仍然有效,所有权未转移

模式匹配与 Option/Result

Rust 强制处理所有可能的分支,消除了 C/C++ 中未处理 NULL 的隐患。

fn main() {
    let some_number = Some(5);
    let absent_number: Option<i32> = None;

    match some_number {
        Some(n) => println!("数字是 {}", n),
        None    => println!("没有数字"),
    }

    // if let 简化单分支匹配
    if let Some(n) = some_number {
        println!("简化匹配: {}", n);
    }
}

Result<T, E> 是 Rust 错误处理的核心,强制调用者处理 Ok 和 Err:

use std::fs::File;
use std::io::{self, Read};

fn read_username_from_file() -> Result<String, io::Error> {
    let mut file = File::open("hello.txt")?; // ? 运算符:遇到 Err 立即返回
    let mut username = String::new();
    file.read_to_string(&mut username)?;
    Ok(username)
}

// 更简洁的写法
fn read_username() -> Result<String, io::Error> {
    std::fs::read_to_string("hello.txt")
}

宏系统与 Cargo 工程化

Rust 的宏系统分为声明式宏(macro_rules!)和过程宏(Procedural Macros),分别在编译期进行代码生成。vec!、println! 都是声明式宏,而 derive 属性则是过程宏的典型应用。

// 自定义 derive 宏示例(需单独 crate)
#[derive(Debug, Clone, PartialEq)]
struct User {
    id: u64,
    name: String,
}

fn main() {
    let u = User { id: 1, name: "Alice".into() };
    println!("{:?}", u); // Debug trait 自动生成
}

Cargo 是 Rust 的官方构建工具和包管理器,一条命令即可完成项目创建、依赖管理、测试运行和文档生成:

cargo new my_project --bin     # 创建二进制项目
cargo add tokio                # 添加依赖
cargo build --release         #  release 优化编译
cargo test                     # 运行测试
cargo doc --open               # 生成并打开文档

学习路径与资源推荐

阶段一(1-2 周):语法基础

  • 阅读 The Rust Programming Language (官方中译本《Rust 程序设计语言》)前 8 章
  • 在 Rustlings 中完成交互式练习
  • 理解所有权、借用、生命周期、枚举与模式匹配

阶段二(2-3 周):集合与错误处理

  • 深入 Vec、HashMap、String 的底层实现
  • 掌握 Option<T>、Result<T, E> 与错误传播策略
  • 学习泛型与 Trait(接口抽象)

阶段三(3-4 周):并发与智能指针

  • thread::spawn、消息通道(mpsc)、共享状态(Arc<Mutex>)
  • Box<T>、Rc<T>、RefCell<T> 三种智能指针的适用场景
  • 理解 Send 与 Sync trait 的并发安全保证

阶段四:生态与项目实践

  • CLI 工具:clap(命令行解析)+ anyhow(错误处理)
  • Web 服务:Axum / Actix-web / Rocket
  • 异步运行时:Tokio(Rust async/await 的事实标准)
  • FFI:编写 unsafe Rust 与 C 库交互

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「rust」更多文章

  1. 性能剖析与优化
  2. 测试与基准:criterion 与 proptest
  3. Serde 与序列化生态