【Rust】06-函数、控制流与模块组织

函数、控制流与模块组织

学习目标

  • 掌握 Rust 函数定义和返回值写法。
  • 熟悉 if、loop、while、for。
  • 理解模块、可见性和文件组织的基本规则。

函数

Rust 函数使用 fn 定义,参数必须标注类型:

rust 复制代码
fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let result = add(2, 3);
    println!("{result}");
}

函数返回值类型写在 -> 后。函数体最后一个表达式如果没有分号,就作为返回值。

也可以显式使用 return:

rust 复制代码
fn abs(value: i32) -> i32 {
    if value < 0 {
        return -value;
    }

    value
}

Rust 风格通常偏向使用尾表达式,遇到提前返回时再用 return。

语句与表达式

Rust 区分语句和表达式:

  • 语句执行动作,不返回可用值。
  • 表达式计算并产生值。
rust 复制代码
fn main() {
    let x = {
        let y = 3;
        y + 1
    };

    println!("{x}");
}

代码块 { ... } 是表达式,最后的 y + 1 没有分号,所以整个代码块值为 4。

if 表达式

if 可以作为表达式使用:

rust 复制代码
fn main() {
    let score = 85;
    let level = if score >= 60 { "pass" } else { "fail" };

    println!("{level}");
}

所有分支必须返回同一类型:

rust 复制代码
let value = if true { 1 } else { 0 };

loop

loop 表示无限循环,可以用 break 返回值:

rust 复制代码
fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("{result}");
}

while

while 适合条件循环:

rust 复制代码
fn main() {
    let mut n = 3;

    while n > 0 {
        println!("{n}");
        n -= 1;
    }
}

for

遍历集合时优先使用 for:

rust 复制代码
fn main() {
    let numbers = [10, 20, 30];

    for number in numbers {
        println!("{number}");
    }
}

范围也可以遍历:

rust 复制代码
for n in 1..=5 {
    println!("{n}");
}

1..5 不包含 5,1..=5 包含 5。

模块基础

模块用于组织代码和控制可见性:

rust 复制代码
mod math {
    pub fn add(a: i32, b: i32) -> i32 {
        a + b
    }
}

fn main() {
    let result = math::add(1, 2);
    println!("{result}");
}

默认情况下,模块中的项是私有的。需要对外使用时加 pub。

文件组织

当项目变大时,可以把模块拆到文件中:

text 复制代码
src/
├── main.rs
└── math.rs

src/main.rs:

rust 复制代码
mod math;

fn main() {
    println!("{}", math::add(1, 2));
}

src/math.rs:

rust 复制代码
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

mod math; 告诉编译器加载同级的 math.rs 文件。

use

use 可以把路径引入当前作用域:

rust 复制代码
use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert("rust", 1);
}

不要为了省几个字符过度使用通配符导入。清晰的路径更利于阅读。

常见误区

  • 函数参数必须标注类型,局部变量通常可以让编译器推断。
  • 尾表达式不能带分号;带分号就变成语句。
  • if 分支类型必须一致。
  • 模块内的函数默认私有,需要 pub 才能被外部访问。

练习

  1. 写一个函数判断数字是否为偶数。
  2. 用 for 打印 1 到 10 的平方。
  3. 创建一个 math 模块,提供 add 和 multiply 两个公开函数。

后记

2026年6月10日17点23分于上海。

相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构