Rust代码示例
Rust By Example (RBE) 是一个通过可运行示例来展示 Rust 编程语言各种概念和标准库的集合。
Rust By Example 是一个非常有用的资源,适合初学者和有经验的开发者,通过实际代码示例来深入理解和掌握 Rust 编程语言的各个方面。
fox_lht
老码农
锄禾日当午,
汗滴禾下土,
满屏皆代码,
行行都辛苦!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2.2 复合类型
Rust中的元组和数组都是固定长度的复合类型,但存在关键区别:元组可存储不同类型元素(异构),通过索引或解构访问;数组要求同类型元素,支持切片和内置方法。两者都存储在栈上,支持模式匹配和类型推导。元组适用于组合少量异构数据(如函数多返回值),数组适合存储同构数据集合。访问时需注意索引越界问题,直接越界会编译报错,间接越界则会导致运行时错误。原创 2025-10-27 21:05:29 · 411 阅读 · 0 评论 -
Rust代码示例——24.2.演练场
Rust演练场提供了一种通过web界面体验Rust编程的方式。在mdbook中,可以通过添加"editable"关键字使代码块可交互,读者可修改并运行示例代码。使用"ignore"关键字可跳过编译测试。此外,通过在文档中添加html_playground_url属性,可实现类似官方文档的"Run"按钮功能,点击后将在演练场打开代码。这些特性增强了Rust文档的交互性,便于读者实践学习。翻译 2025-09-10 14:44:56 · 225 阅读 · 0 评论 -
Rust代码示例——24.1.文档
Rust文档工具使用指南 本文介绍了Rust的文档工具rustdoc的使用方法。主要内容包括:使用cargodoc构建文档并自动打开浏览器;运行测试的命令区别;文档注释的格式要求(///开头,支持Markdown);结构体和方法的文档示例;文档测试的编写和运行方法;以及三个重要的文档属性:#[doc(inline)](内联文档)、#[doc(no_inline)](禁止内联)和#[doc(hidden)](隐藏文档内容)。这些工具和属性帮助开发者生成高质量的API文档,其中rustdoc被Rust标准库广泛翻译 2025-09-10 11:00:31 · 218 阅读 · 0 评论 -
Rust代码示例——24.元数据
标题虽不能直接指导编程,但提供了工具链和底层支持以优化开发体验,如rustdoc自动生成库文档,演练场整合Rust示例代码便于测试。这些功能简化了编程流程,提升了开发效率。翻译 2025-09-10 10:57:43 · 176 阅读 · 0 评论 -
Rust代码示例——23.兼容性
Rust语言引入了原始标识符(r#)来解决关键字冲突问题。当新版本引入的关键字与旧代码中的标识符重名时,可以通过在标识符前加r#来使用这些保留字。例如,若旧库函数名"try"与新关键字冲突,可通过foo::r#try()调用。这一机制保障了代码的向后兼容性,使老代码能继续使用成为关键字的标识符。翻译 2025-09-10 10:09:40 · 136 阅读 · 0 评论 -
Rust代码示例——22.1.内联汇编
Rust通过asm!宏支持内联汇编,允许在代码中直接嵌入汇编指令。这主要用于性能优化或硬件访问场景,但需注意安全风险,必须包含在unsafe块中。内联汇编支持x86、ARM、AArch64和RISC-V架构,支持输入输出操作数、显式寄存器指定、ABI调用约定等功能。汇编模板支持格式化参数,可使用in、out、inout等限定符控制寄存器分配。此外还支持标签复用、内存操作数和多种优化选项(如pure、nomem等),以帮助编译器优化生成的代码。需谨慎处理寄存器占用问题,避免未预期的副作用。翻译 2025-09-09 17:44:52 · 399 阅读 · 0 评论 -
Rust代码示例——22.不安全的操作
Rust的unsafe机制允许突破编译器安全检查,但需开发者自行确保代码安全。官方强调应尽量少用unsafe代码,主要应用于四种场景:解引用原始指针、调用不安全函数、操作可变静态变量及实现不安全trait。例如,std::slice::from_raw_parts要求指针必须有效且类型正确。使用unsafe时,安全责任从编译器转移给开发者,因此必须为unsafe代码提供明确文档,并保持代码块尽可能小。unsafe的真正价值在于实现编译器无法验证的安全操作、与底层系统交互及性能优化。翻译 2025-09-08 09:46:43 · 184 阅读 · 0 评论 -
Rust代码示例——21.4.Dev-dependencies
Rust通过在Cargo.toml中使用[dev-dependencies]来声明仅测试环境需要的依赖(如pretty_assertions),这些依赖不会影响生产代码。测试模块通过#[cfg(test)]确保测试专用代码隔离,pretty_assertions等工具可增强断言输出可读性但不会增加用户依赖或影响编译性能。这体现了Rust的最小化、可扩展性和零成本抽象设计理念。翻译 2025-09-07 13:02:07 · 199 阅读 · 0 评论 -
Rust代码示例——21.2.文档测试
Rust项目通过文档注释(///)来生成文档,支持Markdown格式并自动测试代码示例。文档注释包含函数摘要、详细说明和特殊区块(如"Examples"、"Panics")。代码块会被编译执行作为文档测试,隐藏代码可用#前缀。cargo test会运行这些测试,确保示例代码的正确性。文档测试旨在展示函数用法,复杂示例可通过隐藏try_main实现错误处理。这种机制既提供使用说明又验证代码可靠性。翻译 2025-09-07 11:26:39 · 215 阅读 · 0 评论 -
Rust代码示例——21.1.单元测试
Rust测试功能摘要:Rust提供了内置的单元测试框架,通过#[test]属性标记测试函数。测试可使用assert!、assert_eq!等宏验证结果。Rust 2018后支持返回Result的测试函数,便于使用?操作符。#[should_panic]可测试预期panic,#[ignore]可忽略特定测试。cargo test支持按名称运行指定测试,--ignored参数可运行被忽略的测试。测试模块需用#[cfg(test)]标记,私有函数也可测试。翻译 2025-09-07 10:54:18 · 184 阅读 · 0 评论 -
Rust代码示例——21.测试
Rust内置强大的测试系统,支持单元测试、集成测试和文档测试三种类型。测试特性包括多种断言宏(assert!, assert_eq!等)、测试控制(#[ignore]标记)和并行执行机制。最佳实践建议分层测试结构、隔离运行测试,并使用dev-dependencies管理测试专用依赖。Rust将测试作为语言核心功能,通过全面的验证机制确保代码可靠性,这是实现内存安全和无畏并发的重要保障。翻译 2025-09-06 10:11:01 · 291 阅读 · 0 评论 -
Rust代码示例——20.8.外部函数接口
Rust通过外部函数接口(FFI)实现与C库的互操作。代码展示了如何声明extern块并使用#[link]属性链接不同平台的C库(Windows的msvcrt和Unix的libm)。关键点包括:使用unsafe标记外部函数调用,通过#[repr(C)]确保内存布局兼容,以及将不安全操作封装为安全API。示例实现了复数运算,包括平方根和余弦函数,并自定义了Debug输出格式。这体现了Rust在保持内存安全的同时与C生态交互的能力,是跨平台系统编程的典型应用。翻译 2025-09-06 09:35:25 · 157 阅读 · 0 评论 -
Rust代码示例——20.6.文件系统操作
本文展示了如何使用Rust的std::fs模块实现常见的文件系统操作,模拟了Unix命令的功能。代码实现了cat、echo、touch、mkdir等命令的核心功能,包括读取文件内容、写入文件、创建目录和文件等操作。重点解析了文件操作的错误处理机制,使用io::Result作为返回类型,并演示了如何通过Path类型进行跨平台路径处理。文章还详细说明了使用OpenOptions进行灵活文件操作的方法,以及在不同平台下创建符号链接的差异。最后展示了完整的文件系统操作流程,从创建目录到删除文件的全过程。翻译 2025-09-05 18:41:28 · 176 阅读 · 0 评论 -
Rust代码示例——20.5.2.进程等候
摘要:Rust代码示例展示了如何通过Command::new("sleep").arg("5").spawn()创建子进程,并使用child.wait()阻塞等待进程结束。关键点包括:1) wait()是阻塞调用,会暂停当前线程;2) 必须调用wait()避免僵尸进程;3) 返回ExitStatus可检查执行结果。代码执行时会暂停5秒,待子进程结束后才打印最终信息。这种模式适用于需要顺序执行命令或获取子进程状态的场景。非阻塞版本可使用try_wait()。(149字)翻译 2025-09-05 18:15:08 · 164 阅读 · 0 评论 -
Rust代码示例——20.5.1.管道
本文演示了Rust中通过管道与子进程交互的方法。代码创建了一个子进程(Windows下使用PowerShell,其他系统使用wc命令),向其stdin写入一段包含所有字母的英文句子,然后读取并打印子进程的输出结果。关键点包括:1) 使用std::process::Command创建子进程;2) 通过Stdio::piped()建立管道通信;3) 正确处理管道生命周期,写入完成后自动关闭stdin;4) 跨平台兼容性处理;5) 错误处理机制。这段代码展示了Rust中进程间通信的典型模式。翻译 2025-09-05 17:48:01 · 245 阅读 · 0 评论 -
Rust代码示例——20.5.子线程
Rust使用process::Command执行外部命令的基本模式:通过链式调用配置命令参数,.output()同步执行并获取process::Output结果。输出包含状态码(stdout/stderr),用success()判断执行状态,String::from_utf8_lossy转换输出。示例演示了执行rustc --version及错误处理,展示了Rust类型安全的系统编程特点,包括显式错误处理、灵活命令配置和资源管理。适用于需要调用系统命令的工具开发。翻译 2025-09-04 16:18:19 · 213 阅读 · 0 评论 -
Rust代码示例——20.4.3.按行读取文件
本文介绍了Rust中文件按行读取的三种实现方法:1)基础方法使用read_to_string和lines();2)简化版使用map和collect;3)高效方法采用BufReader和迭代器。对比了不同方法在内存使用、性能和错误处理上的差异,指出基础方法适合学习和小文件,而高效方法更适合生产环境和大文件处理。文章展示了Rust从简单到高效的编程演进路径,体现了所有权系统、错误处理和迭代器等核心特性,为不同场景下的文件读取提供了实用建议。翻译 2025-09-04 11:03:12 · 273 阅读 · 0 评论 -
Rust代码示例——20.4.2.创建文件
本文演示了Rust中使用File::create()进行文件写入操作。通过静态字符串LOREM_IPSUM作为写入内容,展示了如何以只写模式创建/覆盖文件,并将文本转换为字节序列写入。代码包含完整的错误处理,使用match处理创建和写入阶段的潜在错误(如权限问题),成功时输出确认信息。关键点包括:文件操作的原子性、自动关闭机制、显式错误处理策略,以及字符串到字节的安全转换。该示例体现了Rust文件I/O的安全性(类型系统保证)和简洁性(几行代码完成完整操作),是学习基础文件操作的标准范例。翻译 2025-09-03 22:16:49 · 198 阅读 · 0 评论 -
Rust代码示例——20.4.1.打开文件
Rust文件读取示例展示了安全高效的文件操作方式:通过File::open()以只读模式打开文件,使用read_to_string()读取内容到字符串,并利用match处理可能的错误。核心特点包括自动资源管理(File离开作用域自动关闭)、显式错误处理和路径安全操作。该示例演示了Rust系统编程的优势,实现了完整的文件读取流程:路径准备→文件打开→内容读取→资源清理,同时通过模式匹配提供健壮的错误处理机制,是Rust文件I/O的典型实现模式。翻译 2025-09-03 21:43:16 · 182 阅读 · 0 评论 -
Rust代码示例——20.4.文件读写
摘要: Rust的File结构体封装了操作系统的文件描述符,提供安全的文件读写功能。所有I/O操作均返回显式错误类型io::Result<T>,强制程序员处理潜在错误,确保可靠性和内存安全。其设计特点包括: 显式错误处理:通过Result类型强制覆盖所有错误路径; 零成本抽象:自动管理文件描述符,无运行时性能损耗; 跨平台一致性:统一接口适配不同操作系统; 主动安全:编译时检查错误处理,避免资源泄漏。 这种模式虽增加代码量,但显著提升系统程序的健壮性和可维护性。 (字数:149)翻译 2025-09-03 16:38:42 · 163 阅读 · 0 评论 -
Rust代码示例——20.3.路径
Rust的Path系统提供跨平台路径处理能力,核心结构体Path和PathBuf分别对应不可变引用和可变所有权路径。通过Path::new()创建路径,使用join()、push()等方法进行路径操作,支持安全类型转换如to_str()和as_os_str()。该系统自动适配不同操作系统格式,利用Rust的所有权机制确保内存安全,强制处理非UTF-8路径转换,并保持零成本抽象。作为文件操作基础,它解决了跨平台路径处理难题,体现了Rust在系统编程中平衡安全性与性能的设计理念。翻译 2025-09-03 14:50:34 · 287 阅读 · 0 评论 -
Rust代码示例——20.2.通道
Rust通过mpsc::channel()实现多生产者单消费者的线程通信,提供Sender<T>和Receiver<T>端点。关键特性包括非阻塞发送(send())和阻塞接收(recv()),配合所有权机制确保线程安全。该模式适合任务分发场景,主线程创建工作线程发送消息后统一收集结果,充分体现Rust在并发编程中的内存安全和高性能优势,编译期即可保证无数据竞争。翻译 2025-09-03 13:51:35 · 132 阅读 · 0 评论 -
Rust代码示例——20.1.线程
摘要:Rust通过std::thread模块支持原生OS线程操作。示例代码展示了如何创建10个线程(使用spawn和move闭包),将线程句柄存入向量,并通过join()等待所有线程完成。关键特性包括:真正的操作系统线程、所有权转移确保线程安全、join同步机制。相比异步/绿色线程,OS线程适合CPU密集型任务但开销较大。最佳实践建议控制线程数量,使用Arc和互斥锁处理共享数据,注意错误处理。该示例体现了Rust在并发编程中兼顾底层控制与线程安全的特性。(149字)翻译 2025-09-02 11:17:21 · 116 阅读 · 0 评论 -
Rust代码示例——20.标准库杂项
标准库提供了多种类型来支持线程、通道和文件读写等高级功能,扩展了基本类型的能力。这些工具增强了程序的并发性和I/O操作效率。翻译 2025-09-02 11:13:52 · 89 阅读 · 0 评论 -
Rust代码示例——19.9.Arc(原子引用计数)
摘要:Arc(原子引用计数)是Rust中用于多线程共享数据所有权的智能指针。它通过原子操作管理引用计数,确保线程安全地将数据存储在堆内存中。创建Arc会增加引用计数,克隆操作会原子性地增加计数并返回新指针。与Rc不同,Arc具有线程安全性但性能略低。典型应用场景包括多线程数据共享、并发数据结构和线程池实现。当所有引用离开作用域时,Arc会自动清理内存。示例代码展示了如何在10个线程中安全共享同一个Arc指针。翻译 2025-09-01 15:31:19 · 274 阅读 · 0 评论 -
Rust代码示例——19.8.Rc(引用计数)
Rc是Rust中用于实现多重所有权的智能指针,通过引用计数机制跟踪值的使用情况。当克隆Rc时仅增加引用计数而不深拷贝数据,当计数归零时自动清理内存。示例展示了Rc的创建、克隆、引用计数变化及值访问方式。Rc适用于单线程环境下共享数据所有权的场景,如构建复杂数据结构,但不支持线程安全或可变性操作,需注意循环引用风险。其核心特性包括浅拷贝、自动内存管理和不可变共享。翻译 2025-09-01 15:10:08 · 153 阅读 · 0 评论 -
Rust代码示例——19.7.2.HashSet
HashSet是基于HashMap实现的只存储键值的数据结构,其核心特性是保证元素唯一性。相比Vec,它提供了O(1)时间复杂度的查找性能,并支持四种集合运算:并集(union)、差集(difference)、交集(intersection)和对称差集(symmetric_difference)。HashSet适合需要去重、快速存在性检查或数据集比较的场景,使用时需注意元素需实现Eq和Hash特性,且迭代顺序不确定。这种数据结构在需要确保元素唯一性或进行集合运算时特别有用。翻译 2025-09-01 14:44:35 · 113 阅读 · 0 评论 -
Rust代码示例——19.7.1.更改/自定义键值类型
本文介绍了Rust中HashMap键类型的限制和要求。实现Eq和Hash接口的类型可用作键,包括布尔值、整数、字符串等,但f32/f64因精度问题不适用。通过#[derive(PartialEq,Eq,Hash)]可自动为自定义类型实现相关特性。文章以用户登录系统为例,展示了如何定义Account结构体作为键,使用HashMap存储账户信息,并演示了登录验证过程。关键点包括:自动派生特性简化实现、生命周期处理字符串引用、类型安全保证和模式匹配处理结果。翻译 2025-09-01 11:10:59 · 97 阅读 · 0 评论 -
Rust代码示例——19.7.哈希镜像(HashMap)
本文介绍了Rust中HashMap的基本特性和使用方法。HashMap是一种键值对存储结构,支持布尔值、整型、字符串等多种键类型,并可根据需要自动调整容量。文章通过示例代码展示了如何创建HashMap、插入/更新键值对、获取值(使用模式匹配)、删除键值对以及遍历操作。重点说明了insert方法返回None(新插入)或Some(value)(更新),get方法返回Option<&V>,以及iter方法返回无序键值对迭代器等关键行为。HashMap为Rust程序提供了灵活高效的键值存储解决方翻译 2025-09-01 10:09:02 · 131 阅读 · 0 评论 -
Rust代码示例——19.6.panic!
摘要:Rust的panic!宏用于处理不可恢复错误,触发线程终止和栈回退。示例演示了除零错误时的panic处理:当divisor为0时,调用panic!终止程序,执行栈回退并释放资源(如Box分配的内存)。单线程中panic会导致程序退出并打印错误信息。Rust通过逆序析构保证资源安全,与Result不同,panic适用于不可恢复错误。典型应用包括前置条件验证和测试断言,但需注意性能影响,嵌入式系统可配置为直接终止。该机制体现了Rust的内存安全原则。翻译 2025-08-31 16:03:09 · 128 阅读 · 0 评论 -
Rust代码示例——19.5.1.?操作符
本文介绍了Rust中使用?操作符简化错误处理的方法。通过对比展示了?操作符如何将嵌套的match表达式转换为线性代码结构,使错误处理更清晰。代码示例演示了数学运算中的错误处理,包括除法、对数和平方根的异常情况。?操作符会自动展开Result类型,成功返回值,失败则提前返回错误,并支持自动错误类型转换。这种改进使代码更简洁、可读性更强,同时保持了Rust错误处理的显式特性,适用于需要连续多个可能失败操作的场景。翻译 2025-08-31 15:34:35 · 285 阅读 · 0 评论 -
Rust代码示例——19.5.结果类型(Result)
Rust中的Result枚举类型用于处理可能失败的操作,能携带成功值或错误信息。代码展示了如何定义MathError枚举表示数学错误,并使用Result<f64, MathError>作为返回类型。通过三个安全运算函数(除法、对数、平方根)演示错误处理,最终在op函数中嵌套match实现链式操作。当计算√(ln(1.0/10.0))时会因负数平方根而panic。这种处理方式虽显式但易形成嵌套金字塔,实际可用?运算符优化。翻译 2025-08-31 15:04:45 · 194 阅读 · 0 评论 -
Rust代码示例——19.4.可选项(Option)
本文介绍了Rust中使用Option枚举处理可能失败操作的方法。通过checked_division函数展示了如何用Option<T>(Some/None)安全处理除零错误,避免panic。文章重点解析了模式匹配处理Option、None类型注解、unwrap()方法的风险,并建议使用更安全的替代方案。最后指出Option枚举强制显式处理缺失值的优势,是Rust避免空指针错误的核心机制。翻译 2025-08-28 17:55:00 · 285 阅读 · 0 评论 -
Rust代码示例——19.3.字符串
本文介绍了Rust中的字符串处理,主要涉及两种类型:String(堆分配、可增长的UTF-8字符串)和&str(字符串切片)。演示了字符串反转、字符排序去重、动态构建字符串等操作。详细说明了字符串字面量的转义规则,包括十六进制和Unicode转义。特别介绍了字节字符串(b前缀)的处理,包括原始字节字符串(br前缀)、编码转换(str::from_utf8)以及非UTF-8数据的处理注意事项。文章强调常规字符串必须保证UTF-8有效性,而字节字符串更适合处理二进制数据或混合文本。翻译 2025-08-28 17:34:45 · 250 阅读 · 0 评论 -
Rust代码示例——19.2.向量(vectors)
本文介绍了Rust中Vector(Vec<T>)的基本特性和使用方法。Vector是动态数组,由指针、长度和容量组成,可在运行时增减元素。创建方式包括使用vec!宏或collect()方法。文章演示了push/pop操作、索引访问(可能导致panic)以及安全访问方法get()。重点介绍了三种迭代方式:不可变遍历iter()、带索引的enumerate()和可变遍历iter_mut()。翻译 2025-08-27 16:48:13 · 248 阅读 · 0 评论 -
Rust代码示例——19.1.Box,堆和栈(Box,stack,heap)
摘要:Rust默认在栈上分配值,使用Box<T>可在堆上分配。Box是智能指针,离开作用域自动释放内存。通过*操作符可解引用获取堆值。代码示例展示了Point和Rectangle结构体在栈/堆的分配方式,使用mem::size_of_val()比较内存占用情况:栈变量直接存储值,Box只存储指针(64位系统占8字节)。当Point实现Copy时,解引用会复制值到栈;未实现则移动所有权。Box常用于处理编译时大小未知的数据、避免大对象栈拷贝或实现trait对象。翻译 2025-08-27 15:52:44 · 170 阅读 · 0 评论 -
Rust代码示例——19.标准库类型
Rust标准库提供了多种智能类型来扩展基本功能:String处理可变UTF-8文本;Vec<T>实现动态数组;Option<T>取代null值,强制处理空值情况;Result<T,E>显式处理错误;Box<T>在堆上分配数据。这些类型体现了Rust的核心设计理念:通过所有权系统确保内存安全,强制错误处理保证可靠性,以及明确的类型系统防止运行时错误。它们共同构成了Rust安全高效编程的基础设施。翻译 2025-08-26 14:43:23 · 138 阅读 · 0 评论 -
Rust代码示例——18.6.结果集的遍历(Result的遍历)
本文介绍了在Rust中处理解析错误的几种策略:1. 使用filter_map()过滤失败项;2. 结合map_err()和filter_map()收集错误;3. 使用collect()在遇到错误时立即终止;4. 通过partition()分离成功和失败结果。文章提供了每种方法的代码示例,并展示了如何处理和解包Result类型的结果,最后演示了如何将partition()的结果解包为具体值。这些技巧可以帮助开发者灵活处理集合操作中的错误情况。翻译 2025-08-26 10:24:15 · 148 阅读 · 0 评论 -
Rust代码示例——18.5.5.使用枚举类型将错误统一处理
本文介绍了Rust中通过自定义错误枚举来处理错误的替代方案。主要内容包括: 定义DoubleError枚举类型来包装不同类型的错误(如空向量和解析错误); 实现Display、Error和From等trait来提供错误信息、错误源和类型转换; 展示如何使用该模式处理向量元素解析和错误打印; 分析该方法的优点(类型安全、完整错误信息)和缺点(样板代码); 对比自定义枚举与错误装箱的特性差异,说明适用场景(库开发、复杂错误处理); 提到可以使用第三方库(如thiserror)来减少样板代码。翻译 2025-08-25 16:31:11 · 159 阅读 · 0 评论 -
Rust代码示例——18.5.4.符号?的其他用法
本文介绍了Rust中使用?操作符简化错误处理的方法。?操作符不仅能解包成功值,还能自动转换错误类型后提前返回,这得益于From::from的自动调用。通过对比改进前后的代码,展示了?操作符如何使代码更简洁清晰:将原本需要显式错误转换的链式调用转变为线性顺序执行,同时保持错误处理的完整性和安全性。这种模式特别适用于需要统一处理多种错误类型的场景,既提升了代码可读性,又体现了Rust零成本抽象的理念。翻译 2025-08-25 15:36:07 · 186 阅读 · 0 评论
分享