Rust基础

第4课:函数与模块

🎯 本课目标

掌握Rust函数定义、参数模式、返回值,以及模块系统的组织方式。

1. 函数定义

// 基本函数
fn add(a: i32, b: i32) -> i32 {
    a + b   // 最后表达式作为返回值
}

// 无返回值→单元类型()
fn greet(name: &str) {
    println!("你好, {}!", name);
}

// 提前返回
fn abs(x: i32) -> i32 {
    if x < 0 { return -x; }
    x
}

// 发散函数——永远不返回
fn die() -> ! {
    panic!("游戏结束");
}

fn main() {
    println!("3+4 = {}", add(3, 4));
    greet("Rust");
}

✅ 编译验证通过

2. 参数模式

fn main() {
    // 解构参数
    fn print_coords(&(x, y): &(i32, i32)) {
        println!("位置: ({}, {})", x, y);
    }
    print_coords(&(3, 5));

    // 默认参数→用Option
    fn greet_optional(name: &str, title: Option<&str>) {
        match title {
            Some(t) => println!("{} {}!", t, name),
            None => println!("你好, {}!", name),
        }
    }
    greet_optional("Alice", Some("Dr."));
}

✅ 编译验证通过

3. 函数指针与高阶函数

fn add_one(x: i32) -> i32 { x + 1 }
fn double(x: i32) -> i32 { x * 2 }

fn apply(f: fn(i32) -> i32, x: i32) -> i32 {
    f(x)
}

fn main() {
    println!("apply: {}", apply(add_one, 5));  // 6

    let fns: [fn(i32)->i32; 2] = [add_one, double];
    for f in fns {
        println!("result: {}", f(5));
    }
}

✅ 编译验证通过

4. 模块系统

mod network {
    fn connect() { println!("连接中..."); }

    pub fn send(data: &str) {
        connect();
        println!("发送: {}", data);
    }

    pub mod tcp {
        pub fn listen(port: u16) {
            println!("TCP监听端口{}", port);
        }
    }
}

fn main() {
    network::send("Hello");
    network::tcp::listen(8080);
}

✅ 编译验证通过

可见性规则

关键字可见范围
(默认)当前模块及子模块
pub父模块可见
pub(crate)当前crate内
pub(super)父模块

use导入

use std::collections::HashMap;        // 单个
use std::io::{self, Read, Write};  // 多个
use std::collections::HashMap as Map;  // 别名

文件模块

my_app/
├── src/
│   ├── main.rs      // crate root
│   ├── network.rs   // mod network;
│   └── network/
│       ├── mod.rs
│       └── tcp.rs

5. 函数调用的内存模型

函数调用时栈帧: main()栈帧 ┌─────────────────┐ │ point = (3, 5) │ │ result ← 等待 │ └──────┬──────────┘ │ 调用 print_coords(&point) print_coords() ┌─────────────────┐ │ &(3,5) ← 引用 │ │ x=3, y=5 │ ← 解构 └─────────────────┘ 引用传参只传指针,值传参复制数据

📝 练习题

练习1:递归vs迭代

实现斐波那契数列两种版本并比较性能。

练习2:模块设计

设计计算器模块:add/sub/mul/div四个公开函数+私有验证。

练习3:函数组合

实现compose函数,组合多个函数。

🏆

成就解锁:架构师雏形

掌握函数和模块系统,能组织可维护的Rust代码

🔬 深度理解:Rust的设计哲学

Rust的设计遵循几个核心原则,理解这些原则能帮助你更好地使用Rust:

1. 显式优于隐式

Rust要求你显式声明可变性(mut)、生命周期、错误处理。没有隐式类型转换、没有隐式异常传播、没有隐式GC。虽然代码更冗长,但行为更可预测。

2. 编译期检查优于运行时检查

借用检查器、生命周期分析、trait约束——所有这些都在编译期完成。这意味着运行时零开销。你付出的代价是编译时间,换来的是运行时性能和安全。

3. 零成本抽象

高层抽象(泛型、trait、迭代器、async/await)编译后与手写底层代码一样高效。你不需要在抽象和性能之间做选择。

4. 所有权是核心

所有其他特性——借用检查、生命周期、并发安全——都建立在所有权模型之上。理解所有权,就理解了Rust。

📖 Rust发展历史

年份里程碑
2006Graydon Hoare开始Rust项目
2009Mozilla开始赞助
2010首次公开
2012第一个预发布版
2015Rust 1.0发布
2016-2024连续Stack Overflow最受喜爱语言
2022Linux内核接纳Rust
2023Android、Windows开始使用Rust
2024Rust基金会成立,生态系统成熟
2026你正在学习Rust!

💡 学习路径建议

基础阶段(1-2周):完成本课程第1-7课,重点理解所有权和借用。

进阶阶段(2-3周):完成第8-14课,掌握trait、泛型、智能指针。

系统阶段(2-3周):完成第15-21课,实际写并发程序。

网络阶段(2-3周):完成第22-28课,构建真实的网络服务。

实战阶段(持续):完成第29-35课,开始自己的项目。


📚 扩展阅读

以下资源帮助你深入学习本课主题:

🔑 关键术语回顾

本课涉及的核心概念,确保你理解每一个:

术语说明
所有权Rust内存管理的核心机制,每个值有唯一所有者
借用通过引用访问数据,不获取所有权
生命周期引用有效的范围,编译期分析工具
traitRust的接口/抽象机制,类似其他语言的接口
泛型参数化类型,零成本抽象
模式匹配强大的数据解构和分支机制
零成本抽象高层抽象不引入运行时开销
fearless concurrency编译器保证线程安全

💬 学习建议

  1. 动手编码 — 每个代码示例都在本地运行一遍
  2. 修改实验 — 故意改错代码,看编译器报什么错
  3. 完成练习 — 每课的练习题是巩固知识的关键
  4. 阅读源码 — 看标准库和优秀开源项目的实现
  5. 写项目 — 真正掌握需要构建真实项目

🤔 常见问题

Q: Rust学习曲线真的很陡吗?

A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。

Q: Rust适合什么项目?

A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。

Q: 遇到编译错误怎么办?

A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。