Rust教程
文章平均质量分 75
fox_lht
老码农
锄禾日当午,
汗滴禾下土,
满屏皆代码,
行行都辛苦!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第十六章 智能指针
本文介绍了Rust中智能指针的概念与用法。智能指针是拥有额外元数据和能力的数据结构,相比普通引用具有所有权管理能力。主要内容包括: 基础智能指针Box:用于堆分配、递归类型等场景,实现了Deref和Drop trait,可自动解引用和释放内存。 引用计数Rc:支持多所有权共享数据,通过引用计数管理生命周期,但仅提供不可变访问。 内部可变性RefCell:在运行时检查借用规则,允许在不可变引用下修改内部数据。 组合应用:Rc与RefCell结合可实现多所有者且可修改的数据结构。 循环引用问题:通过Weak弱引原创 2026-08-03 09:05:32 · 437 阅读 · 0 评论 -
15.4.循环和迭代器的性能比较
本文通过基准测试比较了Rust中使用循环和迭代器查找字符串的性能差异,结果显示两者性能相近。作者指出迭代器作为Rust的零成本抽象,编译后代码与手写低级代码效率相当,且能应用循环展开等优化。文章强调闭包和迭代器融合了函数式编程理念,在保证高性能的同时提升代码可读性,体现了Rust零成本抽象的设计目标。建议开发者可放心使用这些高级特性,无需担心性能损失。原创 2026-06-12 14:27:42 · 311 阅读 · 0 评论 -
15.3.改进我们之前的输入、输出项目
本文介绍了如何通过迭代器改进Rust代码。首先讲解了在Config::build函数中使用迭代器替代数组索引和clone方法,通过next()方法直接获取参数值并转移所有权,使代码更简洁高效。其次展示了如何在search函数中用迭代器适配器(filter和collect)替换传统的for循环,消除可变状态,提升代码可读性和潜在并发安全性。最后讨论了迭代器与循环的选择,指出虽然迭代器学习曲线较陡,但能更清晰地表达逻辑意图,且通过迭代器的惰性求值特性可能带来性能优势。这些改进使代码更加函数式和现代化。原创 2026-06-12 14:25:52 · 260 阅读 · 0 评论 -
15.2.使用迭代器处理一系列子项
本文介绍了Rust中的迭代器模式,主要包括: 迭代器是惰性加载的,需要消费方法才会执行; Iterator trait的核心是next方法,返回Some(Item)或None; 迭代器分为消费性适配器(如sum)和迭代器适配器(如map); 可通过闭包捕获环境变量来实现过滤等复杂操作; 示例展示了iter、into_iter、iter_mut等不同迭代器创建方式,以及map、filter等常用方法的使用。迭代器模式简化了集合遍历,提高了代码复用性和灵活性。原创 2026-06-12 14:22:22 · 276 阅读 · 0 评论 -
第十五章 函数式语言:迭代器和闭包
本文介绍了Rust语言中函数式编程的两个重要特性:闭包和迭代器。闭包是可以捕获环境的匿名函数,有三种捕获方式(不可变借用、可变借用、所有权转移),并支持FnOnce、FnMut和Fn三种trait。文章通过T恤库存管理示例演示了闭包的实际应用,并对比了闭包与函数的异同。迭代器则是处理元素序列的高效方式。这些特性使Rust代码更简洁高效,是编写地道Rust代码的关键。文中还详细讲解了闭包的类型推断、所有权转移和性能特点。原创 2026-06-11 17:14:41 · 269 阅读 · 0 评论 -
14.6.将错误重定向到标准错误
本文介绍了Rust中标准输出和标准错误的区别及使用方法。通过println!宏只能向标准输出设备显示信息,而eprintln!宏则用于向标准错误流输出错误信息。作者演示了如何通过重定向符号">"将标准输出保存到文件,同时保持错误信息显示在屏幕上。最后修改程序代码,将错误信息改用eprintln!宏输出,实现了成功信息写入文件、错误信息显示在屏幕上的功能。文章总结了如何利用Rust的标准I/O操作编写更有效的命令行程序,涵盖参数处理、文件操作和错误显示等内容。原创 2026-06-11 17:05:58 · 342 阅读 · 0 评论 -
14.5.使用环境变量
本文介绍了如何在Rust程序中实现大小写敏感/不敏感的搜索功能。通过环境变量IGNORE_CASE来控制搜索行为,避免了每次运行都要设置参数的麻烦。采用TDD开发流程: 首先编写测试用例,区分大小写敏感(case_sensitive)和不敏感(case_insensitive)两种情况 实现search_case_insensitive函数,通过to_lowercase()统一转换为小写比较 在Config结构体新增ignore_case字段,通过env::var检查环境变量 run函数根据配置决定调用哪个原创 2026-06-11 17:01:08 · 186 阅读 · 0 评论 -
14.4.测试驱动开发
本文摘要:文章介绍了如何使用测试驱动开发(TDD)方法实现Rust文件搜索功能。首先将搜索逻辑抽离到lib.rs文件,然后编写失败的测试用例定义预期行为(搜索"duct"返回匹配行)。随后逐步实现search函数:通过遍历文件内容行、检查是否包含查询字符串、收集匹配行。重点讨论了Rust生命周期注解的必要性,指出只需对contents参数和返回值声明相同生命周期。最终测试通过后,演示了程序搜索"frog"、"body"等单词的实际运行效果。整个过程原创 2026-06-11 16:57:05 · 231 阅读 · 0 评论 -
14.3.重构
本文介绍了如何通过重构改进Rust程序,重点解决了四个核心问题:1. 主函数职责过多,通过将业务逻辑分离到lib.rs中实现关注点分离。2. 配置变量管理混乱,使用Config结构体封装相关参数。3. 错误信息不够友好,用Result替代panic并提供明确提示。4. 参数不足时的错误处理,通过检查参数数量并返回用户友好消息。重构步骤包括:创建parse_config函数抽取参数解析逻辑、引入Config结构体管理配置、将parse_config转为Config::new方法、改进错误处理机制、最后将核心业原创 2026-06-04 16:15:12 · 263 阅读 · 0 评论 -
14.2.读文件
本文介绍了如何通过Rust程序从指定文件路径读取文本内容。示例代码使用std::fs模块读取名为poem.txt的诗歌文件,该文件包含艾米丽·狄更斯的诗歌文本。程序通过命令行参数接收文件路径,使用read_to_string方法读取文件内容并输出。虽然当前功能正常运行,但作者指出代码存在两个主要问题:主函数职责过多(应遵循单一职责原则),以及缺乏完善的错误处理机制。文章强调在项目早期进行代码重构的重要性,因为小规模代码更容易调整优化。示例运行结果显示成功读取并输出了诗歌文件内容。原创 2026-06-04 16:06:59 · 276 阅读 · 0 评论 -
第十四章 一个输入和输出项目:构建一个命令行程序
本章介绍了如何使用Rust创建一个简单的命令行grep工具。主要内容包括: 项目概述:通过构建简化版grep工具,练习Rust文件操作、输入输出等核心概念 参数处理: 使用std::env::args获取命令行参数 将参数保存到变量(query和file_path) 处理参数索引(跳过程序名参数args[0]) 基础实现: 读取两个必需参数(搜索字符串和文件名) 验证参数获取功能 后续方向:提及将扩展错误处理、文件读取和字符串搜索功能 通过这个项目,开发者能学习Rust标准库使用、参数处理等基础知识,为构建原创 2026-06-04 16:04:29 · 320 阅读 · 0 评论 -
13.3.测试的组织方式
本文摘要: Rust测试分为单元测试和集成测试。单元测试位于src目录各文件中,使用#[cfg(test)]标记测试模块,可测试私有功能。集成测试位于tests目录,作为外部调用者仅测试公共API,每个测试文件编译为独立crate。集成测试可使用子模块组织代码,通过mod.rs文件避免输出干扰。二进制项目需通过库箱暴露功能才能进行集成测试。两种测试对确保代码质量都至关重要,Rust的类型系统虽能预防部分错误,但仍需测试保证逻辑正确性。原创 2026-06-04 16:00:00 · 378 阅读 · 0 评论 -
13.2.控制测试如何运行
本文介绍了Rust测试工具cargotest的使用方法。cargotest默认并行运行所有测试并捕获输出,可通过参数调整测试行为。主要功能包括:1)使用--test-threads控制并行度;2)通过--show-output显示成功测试的输出;3)按名称筛选测试用例;4)使用#[ignore]标记耗时测试,配合--ignored单独运行被忽略的测试。文章详细说明了如何通过命令行参数控制测试范围、输出格式和运行方式,帮助开发者高效执行测试并获取所需信息。原创 2026-05-25 16:55:02 · 404 阅读 · 0 评论 -
第十三章 编写自动化测试
Rust测试机制解析 摘要:Rust通过类型系统保证内存安全和数据竞争防护,但无法验证业务逻辑正确性。测试机制填补了这一空白,主要包括: 测试结构:使用#[test]属性标记测试函数,通过assert!系列宏验证结果 测试类型:单元测试验证独立功能,集成测试验证模块协作 错误处理:通过should_panic属性测试预期panic,支持自定义错误消息 返回值测试:支持Result<T,E>作为测试返回值,可使用?操作符简化测试代码 测试组织:自动生成的测试模块提供基础结构,开发者只需添加具体测试原创 2026-05-25 16:45:58 · 427 阅读 · 0 评论 -
12.3.使用生命周期使引用一直有用
Rust生命周期机制解析 摘要: Rust的生命周期系统通过编译时检查确保引用有效性,防止悬空引用和数据竞争。生命周期标注主要应用于函数返回引用、结构体包含引用等场景。编译器通过借用检查器比较作用域判断引用合法性,要求被引用者生命周期必须长于引用者。函数签名中的生命周期参数建立了输入与输出引用的关系,结构体中的引用字段也需要生命周期标注。Rust通过生命周期省略规则简化常见场景的标注,但复杂情况仍需显式声明。静态生命周期'static表示整个程序运行期有效的引用。生命周期机制与泛型、trait共同构成了Ru原创 2026-05-15 16:18:08 · 525 阅读 · 0 评论 -
12.2.在接口中使用泛型
Rust中的Trait(特性)是定义共享行为的接口机制,类似于其他语言的接口概念。通过trait关键字可以定义一组方法签名,类型通过impl Trait for Type语法实现这些方法。Trait支持默认实现、作为函数参数和返回值使用,并通过Trait Bound约束泛型类型。关键特性包括:孤儿规则防止实现冲突、全覆盖实现批量扩展功能、where子句简化复杂约束。Trait的核心思想是描述类型"能做什么"而非"是什么",为Rust的类型系统提供了灵活的多态支持,同时原创 2026-05-14 09:34:32 · 385 阅读 · 0 评论 -
第十一章 错误处理
Rust错误处理机制解析 Rust采用独特的错误处理方式,将错误分为可恢复错误(Result<T,E>)和不可恢复错误(panic!)。与主流语言的异常机制不同,Rust要求开发者显式处理可能的错误情况。对于可恢复错误,推荐使用Result枚举配合?运算符进行传播;对于不可恢复错误则使用panic!终止程序。文章详细介绍了panic的使用场景、配置策略(unwinding/abort)以及Result的各种处理方法(match/unwrap/expect/?),并对比了不同场景下的最佳实践选择。原创 2026-05-09 10:52:25 · 357 阅读 · 0 评论 -
第十章 通用集合
本文介绍了Rust标准库中三种核心集合类型:向量(Vec<T>)、字符串(String/&str)和哈希映射(HashMap<K,V>)。向量是动态数组,支持高效的元素访问和修改;字符串严格采用UTF-8编码,强调安全性而非便捷索引;哈希映射提供键值存储,通过entryAPI实现安全更新。每种集合都有独特的内存管理方式和所有权规则:向量和字符串数据存储在堆上,哈希映射键值遵循移动语义。文章详细说明了各集合的创建、访问、修改方法,特别强调了Rust特有的安全机制,如get()方原创 2026-04-29 16:11:27 · 528 阅读 · 0 评论 -
第九章 包、箱和模块
本文介绍了Rust代码组织的最佳实践。主要内容包括:1. 模块系统:使用mod关键字组织代码,通过pub控制可见性,采用绝对路径和相对路径访问模块成员。2. 文件拆分:当模块规模增长时,可将代码拆分到独立文件中,保持模块树结构不变。3. 使用技巧:利用use创建路径快捷方式,通过pub use重新导出API,使用as解决命名冲突。4. 结构体和枚举的可见性控制:结构体字段默认私有需显式公开,枚举变体随枚举自动公开。5. 项目结构建议:二进制箱调用库箱,保持清晰的API边界,隐藏实现细节。这些实践能有效提升代原创 2026-04-24 15:37:45 · 417 阅读 · 0 评论 -
8.3.使用if let和let else实现简明的程序流控制
Rust 中的 if let 和 let else 语法是 match 表达式的简洁替代方案。if let 适用于只关心一种匹配模式的情况,能避免 match 必须处理所有分支的冗余代码。当需要处理不匹配情况时,可以添加 else 分支。let else 语法则更进一步,专门用于"匹配成功则绑定,失败则提前返回"的场景,使主逻辑更清晰。这两种语法与 match 各有所长:match 确保完整性检查,if let 适合简单条件绑定,let else 则优化了错误处理流程。实际开发中应根据场原创 2026-04-22 16:12:34 · 441 阅读 · 0 评论 -
8.3 使用if let和let else实现简明的程序流控制
Rust中的if let语法可以简化match表达式,当只需要处理特定分支时。相比match必须处理所有分支,if let只需关注需要的分支,并可结合else处理其他情况。示例展示了从match到if let的转换,以及如何使用let else语法更清晰地解构枚举值并处理特定分支。这种方法特别适用于只需处理枚举类型中部分情况的场景,使代码更简洁高效。原创 2026-04-22 10:56:18 · 102 阅读 · 0 评论 -
8.2 match控制流结构
Rust的match表达式提供强大的模式匹配功能,能够处理枚举、Option<T>等多种数据类型。它可以精确匹配特定值,使用_占位符处理剩余情况,并通过编译器强制检查确保所有可能性都被覆盖。match支持单行表达式和多行代码块,还能解构带值的枚举类型。对于Option<T>,可以匹配Some和None分别处理。如果分支过多,可用other或_通配符简化代码。这种全面的模式匹配机制使Rust能够安全高效地处理各种控制流场景。原创 2026-04-22 10:48:55 · 79 阅读 · 0 评论 -
第八章 枚举的定义
本文介绍了Rust中枚举类型(enum)的定义和使用方法。主要内容包括:1) 枚举的基本语法和使用场景;2) 如何将值与枚举类型关联;3) 枚举与结构体的比较;4) Option枚举类型的特殊用法。通过IP地址版本的示例,展示了枚举如何简化代码结构,并详细说明了Option<T>枚举在处理空值时的优势。文章还演示了枚举方法的定义、值的提取等实用技巧,帮助读者更好地理解Rust枚举的强大功能。原创 2026-04-20 16:59:05 · 398 阅读 · 0 评论 -
7.3.结构体-方法
本文介绍了Rust中方法的概念及其实现方式。方法必须归属于结构体、枚举或trait对象,与函数的区别在于方法必须通过实例调用且第一个参数总是self。文章通过Rectangle结构体的示例展示了如何定义和调用方法,包括基本方法、带参数的方法以及关联函数。特别说明了Rust的自动引用和解引用特性简化了方法调用,以及如何通过多个impl块为同一结构体添加功能。最后强调了结构体在组织相关数据和功能方面的重要性,使得代码更加清晰和模块化。原创 2026-04-16 22:56:06 · 385 阅读 · 0 评论 -
7.2.结构体-示例
本文展示了如何通过结构体重构计算长方形面积的Rust程序。首先使用基本变量实现功能,然后逐步改进:1)使用元组增强结构性;2)引入结构体提高代码可读性;3)通过#[derive(Debug)]注解实现调试输出;4)比较println!和dbg!宏的区别。重点演示了结构体如何更好地组织相关数据,以及Rust的调试工具使用方法,最终实现了更清晰、可维护的面向对象风格代码。整个过程体现了Rust从过程式到结构化编程的演进思路。原创 2026-04-16 10:52:04 · 248 阅读 · 0 评论 -
第七章 结构体
本文介绍了Rust中结构体的基本概念和使用方法。结构体(struct)是一种包含属性名称和类型的复合数据类型,与元组的主要区别在于包含属性名称。文章详细说明了结构体的定义语法、实例化方式、属性访问和修改方法,并介绍了结构体更新语法、元组结构体和单元结构体等特殊形式。此外,还讨论了结构体数据所有权问题,指出若要在结构体中使用引用类型,必须使用生命周期来确保数据有效性。通过多个代码示例,展示了结构体的各种用法,包括属性简写、方法返回和元组结构体的定义等。原创 2026-04-16 09:27:16 · 355 阅读 · 0 评论 -
第二章 数据类型
Rust是静态类型语言,数据类型分为标量类型和复合类型。标量类型包括整型(i8/u8等)、浮点型(f32/f64)、布尔型和字符型(char),各自具有固定字节长度和取值范围。整型支持多种进制表示,并定义了溢出处理机制(调试模式报错/发布模式环绕)。数值运算支持基本算术操作(加减乘除取余)。字符型采用Unicode编码,占4字节。类型由显式定义或编译器推断,推断失败会报错。原创 2025-10-27 21:01:50 · 538 阅读 · 0 评论 -
1.2 变量的重新赋值——遮蔽
Rust中的遮蔽(Shadowing)允许在同一作用域内重新声明同名变量,甚至可以改变变量类型。遮蔽会创建新变量,旧变量不再可用。与可变变量(mut)不同,遮蔽采用重新声明(let)方式,能更改变量类型,而mut变量只能修改值。示例展示了遮蔽的基本用法、类型转换和局部作用域特性,适用于需要临时转换变量类型的场景。这种机制提供了比可变变量更灵活的类型转换能力,同时保持了Rust的安全特性。原创 2025-10-21 16:08:58 · 292 阅读 · 0 评论 -
第一章 不可变的变量
Rust语言中变量默认是不可变的(immutable),这是其独特特性。示例代码尝试修改不可变变量x时会报错"cannot assign twice to immutable variable"。如需可变变量,需使用mut关键字声明:let mut x=5。通过比较错误代码和正确代码的执行结果,展示了Rust的变量可变性控制机制。这一特性有助于提高代码安全性,防止意外修改变量值。修改后的可变变量代码能正常执行并输出预期结果。原创 2025-10-21 15:30:44 · 229 阅读 · 0 评论
分享