跳到主要内容Rust 控制流实战:条件、循环与模式匹配 | 极客日志Rust算法
Rust 控制流实战:条件、循环与模式匹配
Rust 控制流涵盖条件表达式、循环结构与模式匹配。解析 if/else 返回值特性,对比 loop/while/for 差异,深入 match 表达式与解构技巧,并提供错误处理及代码可读性最佳实践,帮助开发者编写安全高效的 Rust 逻辑。
指针猎手7 浏览 Rust 控制流详解
4.1 条件表达式 if/else
4.1.1 基础条件表达式
在 Rust 中,if 不仅仅是分支判断,它本身就是一个表达式,这意味着它可以返回一个值。这种特性让代码更加紧凑和灵活。
fn basic_conditionals() {
println!("=== 基础条件表达式 ===");
let number = 7;
if number < 5 {
println!("条件为真");
} else {
println!("条件为假");
}
let score = 85;
if score >= 90 {
println!("优秀");
} else if score >= 80 {
println!("良好");
} else if score >= 70 {
println!("中等");
} else if score >= 60 {
println!("及格");
} else {
println!("不及格");
}
let condition = true;
= condition { } { };
(, result);
= ;
= number % == { } { };
(, number, is_even);
= ;
= ;
= x > y { }
x < y { }
{ };
(, comparison);
= ;
flag {
();
}
!flag {
();
}
}
let
result
if
"真分支的值"
else
"假分支的值"
println!
"if 表达式结果:{}"
let
number
6
let
is_even
if
2
0
"偶数"
else
"奇数"
println!
"{} 是 {}"
let
x
10
let
y
20
let
comparison
if
"x 大于 y"
else
if
"x 小于 y"
else
"x 等于 y"
println!
"比较结果:{}"
let
flag
true
if
println!
"标志为真"
if
println!
"标志为假"
条件运算符
Rust 提供了标准的比较和逻辑运算符,支持短路求值,这对性能优化很有帮助。
fn conditional_operators() {
println!("\n=== 条件运算符 ===");
let a = 10;
let b = 20;
println!("比较运算:");
println!(" {} == {}: {}", a, b, a == b);
println!(" {} != {}: {}", a, b, a != b);
println!(" {} < {}: {}", a, b, a < b);
println!(" {} > {}: {}", a, b, a > b);
println!(" {} <= {}: {}", a, b, a <= b);
println!(" {} >= {}: {}", a, b, a >= b);
let has_permission = true;
let has_credits = false;
println!("逻辑运算:");
println!(" 与运算:{}", has_permission && has_credits);
println!(" 或运算:{}", has_permission || has_credits);
println!(" 非运算:{}", !has_permission);
let age = 25;
let has_license = true;
if age >= 18 && has_license {
println!("可以驾驶");
} else {
println!("不能驾驶");
}
println!("\n短路求值演示:");
fn expensive_check() -> bool {
println!("执行昂贵检查...");
true
}
let condition1 = false;
let condition2 = true;
if condition1 && expensive_check() {
println!("条件 1 为真");
}
if condition2 || expensive_check() {
println!("条件 2 为真");
}
let temperature = 25;
let is_sunny = true;
let is_weekend = false;
let should_go_out = if temperature > 20 && temperature < 30 && is_sunny {
if is_weekend { "绝对要出门!" } else { "天气很好,但得上班" }
} else { "还是呆在家里吧" };
println!("出门建议:{}", should_go_out);
}
4.1.2 高级条件表达式模式
掌握一些高级模式可以让你的代码更健壮,比如守卫子句和早期返回。
fn advanced_conditional_patterns() {
println!("=== 高级条件表达式模式 ===");
fn process_user(age: Option<u32>, has_consent: bool) -> String {
if age.is_none() { return "年龄信息缺失".to_string(); }
let age = age.unwrap();
if !has_consent { return "需要用户同意".to_string(); }
if age < 18 { return "用户未成年".to_string(); }
"处理成功".to_string()
}
println!("守卫条件示例:{}", process_user(Some(20), true));
let mut counter = 0;
let max_attempts = 3;
while let true = { counter += 1; counter <= max_attempts } {
println!("尝试 {} of {}", counter, max_attempts);
}
let is_weekday = true;
let is_holiday = false;
let has_meeting = true;
let workload = 75;
let should_work_from_home = (is_weekday && !is_holiday) && (has_meeting || workload > 80);
println!("应该在家办公:{}", should_work_from_home);
let config = Some("production");
if let Some(env) = config {
println!("运行在 {} 环境", env);
}
let point = (5, 10);
if let (x, y) = point {
if x > 0 && y > 0 {
println!("点 ({}, {}) 在第一象限", x, y);
}
}
fn parse_number(s: &str) -> Result<i32, String> {
if s.is_empty() { return Err("字符串为空".to_string()); }
if !s.chars().all(|c| c.is_ascii_digit()) { return Err("包含非数字字符".to_string()); }
Ok(s.parse().unwrap())
}
match parse_number("123") {
Ok(num) => println!("解析成功:{}", num),
Err(e) => println!("解析失败:{}", e),
}
#[cfg(debug_assertions)]
println!("这是调试构建");
#[cfg(not(debug_assertions))]
println!("这是发布构建");
}
4.2 循环:loop、while、for
4.2.1 loop 循环深度解析
loop 是 Rust 中最基础的无限循环结构,必须显式中断。
fn loop_deep_dive() {
println!("=== loop 循环深度解析 ===");
let mut counter = 0;
loop {
counter += 1;
println!("循环次数:{}", counter);
if counter >= 5 { break; }
}
let result = loop {
counter += 1;
if counter >= 10 { break counter * 2; }
};
println!("loop 返回值:{}", result);
'outer: loop {
println!("进入外部循环");
let mut inner_counter = 0;
'inner: loop {
inner_counter += 1;
println!(" 内部循环:{}", inner_counter);
if inner_counter >= 3 { break 'inner; }
}
counter += 1;
if counter >= 2 { break 'outer; }
}
let mut values = vec![1, 2, 3, 4, 5].into_iter();
loop {
match values.next() {
Some(value) => {
println!("处理值:{}", value);
if value == 3 {
println!("找到目标值,继续处理...");
continue;
}
},
None => {
println!("没有更多值");
break;
}
}
}
}
4.2.2 while 循环深度解析
fn while_loop_deep_dive() {
println!("=== while 循环深度解析 ===");
let mut counter = 0;
while counter < 5 {
println!("计数器:{}", counter);
counter += 1;
}
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
println!("栈内容:");
while let Some(top) = stack.pop() {
println!("弹出:{}", top);
}
let mut x = 100;
while x > 0 {
x /= 2;
if x == 0 { break; }
println!("x = {}", x);
}
process_user_input_simulation();
}
fn process_user_input_simulation() {
println!("\n=== 用户输入处理模拟 ===");
use std::collections::VecDeque;
let mut input_queue = VecDeque::from(["help".to_string(), "exit".to_string(), "invalid".to_string(), "status".to_string(),]);
let mut running = true;
while running && !input_queue.is_empty() {
let input = input_queue.pop_front().unwrap();
match input.as_str() {
"help" => { println!("显示帮助信息"); },
"exit" => { println!("退出程序"); running = false; },
"status" => { println!("显示状态信息"); },
_ => { println!("未知命令:{}", input); }
}
}
println!("输入处理结束");
}
4.2.3 for 循环深度解析
Rust 的 for 循环主要用于迭代集合,基于 Iterator trait。
fn for_loop_deep_dive() {
println!("=== for 循环深度解析 ===");
println!("范围迭代:");
for i in 0..5 {
println!("i = {}", i);
}
println!("包含范围:");
for i in 0..=5 {
println!("i = {}", i);
}
let numbers = [10, 20, 30, 40, 50];
println!("数组迭代:");
for number in numbers {
println!("数字:{}", number);
}
let names = vec!["Alice", "Bob", "Charlie"];
println!("向量迭代:");
for name in &names {
println!("名字:{}", name);
}
println!("带索引迭代:");
for (index, name) in names.iter().enumerate() {
println!("索引 {}: {}", index, name);
}
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert("Alice", 100);
scores.insert("Bob", 85);
scores.insert("Charlie", 92);
println!("哈希映射迭代:");
for (name, score) in &scores {
println!("{}: {}", name, score);
}
println!("反向迭代:");
for i in (0..5).rev() {
println!("i = {}", i);
}
println!("步长迭代:");
for i in (0..20).step_by(3) {
println!("i = {}", i);
}
}
4.3 模式匹配与 match 表达式
4.3.1 match 表达式基础
match 是 Rust 最强大的控制流工具,提供全面的模式匹配能力,且强制穷尽性检查。
fn match_expression_basics() {
println!("=== match 表达式基础 ===");
let number = 13;
match number {
1 => println!("一"),
2 | 3 | 5 | 7 | 11 => println!("质数"),
13..=19 => println!("青少年数字"),
_ => println!("其他数字"),
}
let number = 5;
let description = match number {
1 => "一",
2 => "二",
3 => "三",
_ => "很多",
};
println!("数字 {} 是 {}", number, description);
let flag = true;
match flag {
true => println!("真"),
false => println!("假"),
}
let grade = 'A';
match grade {
'A' | 'B' | 'C' => println!("及格"),
'D' => println!("勉强及格"),
'F' => println!("不及格"),
_ => println!("无效成绩"),
}
let language = "Rust";
match language {
"Rust" => println!("系统编程语言"),
"Python" => println!("脚本语言"),
"Java" => println!("企业级语言"),
_ => println!("其他语言"),
}
let boolean = true;
match boolean {
true => println!("真"),
false => println!("假"),
}
let value = 42;
match value {
1 => println!("一"),
2 => println!("二"),
_ => (),
}
}
4.3.2 if let 和 while let
当只需要处理部分模式时,if let 和 while let 比 match 更简洁。
fn if_let_while_let_patterns() {
println!("=== if let 和 while let 模式 ===");
let some_value = Some(5);
match some_value {
Some(x) => println!("值为:{}", x),
None => {},
}
if let Some(x) = some_value {
println!("值为:{}", x);
}
let none_value: Option<i32> = None;
if let Some(x) = none_value {
println!("有值:{}", x);
} else {
println!("没有值");
}
let some_number = Some(10);
if let Some(x) = some_number && x > 5 {
println!("值 {} 大于 5", x);
}
enum Event {
Click { x: i32, y: i32 },
KeyPress(char),
}
let event = Event::Click { x: 100, y: 200 };
if let Event::Click { x, y } = event {
println!("点击位置:({}, {})", x, y);
}
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
println!("使用 while let 弹出栈:");
while let Some(top) = stack.pop() {
println!("弹出:{}", top);
}
}
4.4 控制流最佳实践
4.4.1 代码可读性与维护性
fn readability_best_practices() {
println!("=== 代码可读性最佳实践 ===");
let user_age = 25;
let has_driving_license = true;
if user_age >= 18 && has_driving_license {
println!("可以驾驶");
}
complex_nested_logic();
refactored_complex_logic();
fn process_user_data(name: Option<&str>, age: Option<u32>) -> Result<String, String> {
let name = name.ok_or("姓名缺失")?;
let age = age.ok_or("年龄缺失")?;
if name.is_empty() { return Err("姓名为空".to_string()); }
if age < 18 { return Err("用户未成年".to_string()); }
Ok(format!("用户 {} 年龄 {}", name, age))
}
let temperature = 25;
let is_weekend = true;
let has_plans = false;
let good_weather = temperature > 20 && temperature < 30;
let free_time = is_weekend && !has_plans;
if good_weather && free_time {
println!("好天气,没安排,出门吧!");
}
}
fn complex_nested_logic() {
println!("\n=== 复杂嵌套逻辑(反面教材) ===");
let user_role = "admin";
let is_authenticated = true;
let has_permission = true;
let resource_available = true;
if is_authenticated {
if user_role == "admin" {
if has_permission {
if resource_available {
println!("操作成功");
} else {
println!("资源不可用");
}
} else {
println!("权限不足");
}
} else {
println!("角色不符");
}
} else {
println!("未认证");
}
}
fn refactored_complex_logic() {
println!("\n=== 重构后的逻辑 ===");
let user_role = "admin";
let is_authenticated = true;
let has_permission = true;
let resource_available = true;
if !is_authenticated { println!("未认证"); return; }
if user_role != "admin" { println!("角色不符"); return; }
if !has_permission { println!("权限不足"); return; }
if !resource_available { println!("资源不可用"); return; }
println!("操作成功");
}
4.4.2 错误处理模式
在控制流中优雅地处理错误是 Rust 的核心优势之一。
fn error_handling_patterns() {
println!("=== 错误处理模式 ===");
fn parse_number(s: &str) -> Result<i32, String> {
s.parse().map_err(|_| "解析失败".to_string())
}
let input = "42";
match parse_number(input) {
Ok(number) => println!("解析成功:{}", number),
Err(error) => println!("解析失败:{}", error),
}
fn process_data(data: &str) -> Result<i32, String> {
let num1 = parse_number(data)?;
let num2 = parse_number("100")?;
Ok(num1 + num2)
}
fn find_user(name: &str) -> Option<&str> {
if name == "admin" { Some("管理员用户") } else { None }
}
let user = find_user("admin");
match user {
Some(user_info) => println!("找到用户:{}", user_info),
None => println!("用户不存在"),
}
let user = find_user("guest").unwrap_or("默认用户");
println!("用户:{}", user);
}
通过本章的学习,你已经掌握了 Rust 控制流的核心机制。从灵活的 if 表达式到强大的 match 模式匹配,再到各种循环结构,这些工具将帮助你构建既安全又高效的业务逻辑。下一章我们将深入探讨 Rust 的灵魂:所有权系统。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online