- 博客(289)
- 资源 (6)
- 收藏
- 关注
原创 2.2 复合类型
Rust中的元组和数组都是固定长度的复合类型,但存在关键区别:元组可存储不同类型元素(异构),通过索引或解构访问;数组要求同类型元素,支持切片和内置方法。两者都存储在栈上,支持模式匹配和类型推导。元组适用于组合少量异构数据(如函数多返回值),数组适合存储同构数据集合。访问时需注意索引越界问题,直接越界会编译报错,间接越界则会导致运行时错误。
2025-10-27 21:05:29
272
原创 第二章 数据类型
Rust是静态类型语言,数据类型分为标量类型和复合类型。标量类型包括整型(i8/u8等)、浮点型(f32/f64)、布尔型和字符型(char),各自具有固定字节长度和取值范围。整型支持多种进制表示,并定义了溢出处理机制(调试模式报错/发布模式环绕)。数值运算支持基本算术操作(加减乘除取余)。字符型采用Unicode编码,占4字节。类型由显式定义或编译器推断,推断失败会报错。
2025-10-27 21:01:50
419
原创 1.3 常量
本文介绍了编程中的常量概念及其特性。常量是不可更改的值,其值在编译时确定,作用域内有效。通过Rust代码示例展示了常量的定义方式,并说明同一作用域内不能重复定义同名常量。文章对比了常量与变量的主要区别:常量不可变、必须显式类型注解、可全局作用域等。最后指出常量的适用场景,如配置参数、数字常数等在程序生命周期中不变的量。
2025-10-22 10:55:37
155
原创 1.2 变量的重新赋值——遮蔽
Rust中的遮蔽(Shadowing)允许在同一作用域内重新声明同名变量,甚至可以改变变量类型。遮蔽会创建新变量,旧变量不再可用。与可变变量(mut)不同,遮蔽采用重新声明(let)方式,能更改变量类型,而mut变量只能修改值。示例展示了遮蔽的基本用法、类型转换和局部作用域特性,适用于需要临时转换变量类型的场景。这种机制提供了比可变变量更灵活的类型转换能力,同时保持了Rust的安全特性。
2025-10-21 16:08:58
161
原创 第一章 不可变的变量
Rust语言中变量默认是不可变的(immutable),这是其独特特性。示例代码尝试修改不可变变量x时会报错"cannot assign twice to immutable variable"。如需可变变量,需使用mut关键字声明:let mut x=5。通过比较错误代码和正确代码的执行结果,展示了Rust的变量可变性控制机制。这一特性有助于提高代码安全性,防止意外修改变量值。修改后的可变变量代码能正常执行并输出预期结果。
2025-10-21 15:30:44
150
翻译 Rust代码示例——24.2.演练场
Rust演练场提供了一种通过web界面体验Rust编程的方式。在mdbook中,可以通过添加"editable"关键字使代码块可交互,读者可修改并运行示例代码。使用"ignore"关键字可跳过编译测试。此外,通过在文档中添加html_playground_url属性,可实现类似官方文档的"Run"按钮功能,点击后将在演练场打开代码。这些特性增强了Rust文档的交互性,便于读者实践学习。
2025-09-10 14:44:56
108
翻译 Rust代码示例——24.1.文档
Rust文档工具使用指南 本文介绍了Rust的文档工具rustdoc的使用方法。主要内容包括:使用cargodoc构建文档并自动打开浏览器;运行测试的命令区别;文档注释的格式要求(///开头,支持Markdown);结构体和方法的文档示例;文档测试的编写和运行方法;以及三个重要的文档属性:#[doc(inline)](内联文档)、#[doc(no_inline)](禁止内联)和#[doc(hidden)](隐藏文档内容)。这些工具和属性帮助开发者生成高质量的API文档,其中rustdoc被Rust标准库广泛
2025-09-10 11:00:31
110
翻译 Rust代码示例——24.元数据
标题虽不能直接指导编程,但提供了工具链和底层支持以优化开发体验,如rustdoc自动生成库文档,演练场整合Rust示例代码便于测试。这些功能简化了编程流程,提升了开发效率。
2025-09-10 10:57:43
109
翻译 Rust代码示例——23.兼容性
Rust语言引入了原始标识符(r#)来解决关键字冲突问题。当新版本引入的关键字与旧代码中的标识符重名时,可以通过在标识符前加r#来使用这些保留字。例如,若旧库函数名"try"与新关键字冲突,可通过foo::r#try()调用。这一机制保障了代码的向后兼容性,使老代码能继续使用成为关键字的标识符。
2025-09-10 10:09:40
45
翻译 Rust代码示例——22.1.内联汇编
Rust通过asm!宏支持内联汇编,允许在代码中直接嵌入汇编指令。这主要用于性能优化或硬件访问场景,但需注意安全风险,必须包含在unsafe块中。内联汇编支持x86、ARM、AArch64和RISC-V架构,支持输入输出操作数、显式寄存器指定、ABI调用约定等功能。汇编模板支持格式化参数,可使用in、out、inout等限定符控制寄存器分配。此外还支持标签复用、内存操作数和多种优化选项(如pure、nomem等),以帮助编译器优化生成的代码。需谨慎处理寄存器占用问题,避免未预期的副作用。
2025-09-09 17:44:52
124
翻译 Rust代码示例——22.不安全的操作
Rust的unsafe机制允许突破编译器安全检查,但需开发者自行确保代码安全。官方强调应尽量少用unsafe代码,主要应用于四种场景:解引用原始指针、调用不安全函数、操作可变静态变量及实现不安全trait。例如,std::slice::from_raw_parts要求指针必须有效且类型正确。使用unsafe时,安全责任从编译器转移给开发者,因此必须为unsafe代码提供明确文档,并保持代码块尽可能小。unsafe的真正价值在于实现编译器无法验证的安全操作、与底层系统交互及性能优化。
2025-09-08 09:46:43
98
翻译 Rust代码示例——21.4.Dev-dependencies
Rust通过在Cargo.toml中使用[dev-dependencies]来声明仅测试环境需要的依赖(如pretty_assertions),这些依赖不会影响生产代码。测试模块通过#[cfg(test)]确保测试专用代码隔离,pretty_assertions等工具可增强断言输出可读性但不会增加用户依赖或影响编译性能。这体现了Rust的最小化、可扩展性和零成本抽象设计理念。
2025-09-07 13:02:07
63
翻译 Rust代码示例——21.3.集成测试
Rust中的测试分为单元测试和集成测试。单元测试针对单个模块,可以测试私有代码;集成测试则验证多个模块的公共接口能否协同工作。集成测试文件存放在tests目录下,每个文件会被编译为独立crate。示例中展示了如何测试adder库的add函数,并通过cargo test运行测试。对于需要在多个测试间共享的代码,可以创建common模块(推荐使用tests/common/mod.rs而非tests/common.rs),以避免被误认为测试文件。这种测试结构有助于确保Rust库各部分正常协作。
2025-09-07 11:45:02
88
翻译 Rust代码示例——21.2.文档测试
Rust项目通过文档注释(///)来生成文档,支持Markdown格式并自动测试代码示例。文档注释包含函数摘要、详细说明和特殊区块(如"Examples"、"Panics")。代码块会被编译执行作为文档测试,隐藏代码可用#前缀。cargo test会运行这些测试,确保示例代码的正确性。文档测试旨在展示函数用法,复杂示例可通过隐藏try_main实现错误处理。这种机制既提供使用说明又验证代码可靠性。
2025-09-07 11:26:39
102
翻译 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
75
翻译 Rust代码示例——21.测试
Rust内置强大的测试系统,支持单元测试、集成测试和文档测试三种类型。测试特性包括多种断言宏(assert!, assert_eq!等)、测试控制(#[ignore]标记)和并行执行机制。最佳实践建议分层测试结构、隔离运行测试,并使用dev-dependencies管理测试专用依赖。Rust将测试作为语言核心功能,通过全面的验证机制确保代码可靠性,这是实现内存安全和无畏并发的重要保障。
2025-09-06 10:11:01
121
翻译 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
60
翻译 Rust代码示例——20.7.程序参数的处理
Rust中处理命令行参数的方法:标准库提供env::args()获取参数,返回字符串向量。通过模式匹配可进行简单参数解析,如检查特定值或执行不同操作。对于更复杂需求,推荐使用第三方库如clap。示例展示了如何实现参数验证、数值运算和错误处理,包括帮助信息显示。程序可编译为match_args执行文件,支持不同参数组合,如检查42是否为答案,或对数字进行增减操作。
2025-09-06 09:09:05
61
翻译 Rust代码示例——20.6.文件系统操作
本文展示了如何使用Rust的std::fs模块实现常见的文件系统操作,模拟了Unix命令的功能。代码实现了cat、echo、touch、mkdir等命令的核心功能,包括读取文件内容、写入文件、创建目录和文件等操作。重点解析了文件操作的错误处理机制,使用io::Result作为返回类型,并演示了如何通过Path类型进行跨平台路径处理。文章还详细说明了使用OpenOptions进行灵活文件操作的方法,以及在不同平台下创建符号链接的差异。最后展示了完整的文件系统操作流程,从创建目录到删除文件的全过程。
2025-09-05 18:41:28
45
翻译 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
66
翻译 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
68
翻译 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
65
翻译 Rust代码示例——20.4.3.按行读取文件
本文介绍了Rust中文件按行读取的三种实现方法:1)基础方法使用read_to_string和lines();2)简化版使用map和collect;3)高效方法采用BufReader和迭代器。对比了不同方法在内存使用、性能和错误处理上的差异,指出基础方法适合学习和小文件,而高效方法更适合生产环境和大文件处理。文章展示了Rust从简单到高效的编程演进路径,体现了所有权系统、错误处理和迭代器等核心特性,为不同场景下的文件读取提供了实用建议。
2025-09-04 11:03:12
84
翻译 Rust代码示例——20.4.2.创建文件
本文演示了Rust中使用File::create()进行文件写入操作。通过静态字符串LOREM_IPSUM作为写入内容,展示了如何以只写模式创建/覆盖文件,并将文本转换为字节序列写入。代码包含完整的错误处理,使用match处理创建和写入阶段的潜在错误(如权限问题),成功时输出确认信息。关键点包括:文件操作的原子性、自动关闭机制、显式错误处理策略,以及字符串到字节的安全转换。该示例体现了Rust文件I/O的安全性(类型系统保证)和简洁性(几行代码完成完整操作),是学习基础文件操作的标准范例。
2025-09-03 22:16:49
81
翻译 Rust代码示例——20.4.1.打开文件
Rust文件读取示例展示了安全高效的文件操作方式:通过File::open()以只读模式打开文件,使用read_to_string()读取内容到字符串,并利用match处理可能的错误。核心特点包括自动资源管理(File离开作用域自动关闭)、显式错误处理和路径安全操作。该示例演示了Rust系统编程的优势,实现了完整的文件读取流程:路径准备→文件打开→内容读取→资源清理,同时通过模式匹配提供健壮的错误处理机制,是Rust文件I/O的典型实现模式。
2025-09-03 21:43:16
57
翻译 Rust代码示例——20.4.文件读写
摘要: Rust的File结构体封装了操作系统的文件描述符,提供安全的文件读写功能。所有I/O操作均返回显式错误类型io::Result<T>,强制程序员处理潜在错误,确保可靠性和内存安全。其设计特点包括: 显式错误处理:通过Result类型强制覆盖所有错误路径; 零成本抽象:自动管理文件描述符,无运行时性能损耗; 跨平台一致性:统一接口适配不同操作系统; 主动安全:编译时检查错误处理,避免资源泄漏。 这种模式虽增加代码量,但显著提升系统程序的健壮性和可维护性。 (字数:149)
2025-09-03 16:38:42
56
翻译 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
85
翻译 Rust代码示例——20.2.通道
Rust通过mpsc::channel()实现多生产者单消费者的线程通信,提供Sender<T>和Receiver<T>端点。关键特性包括非阻塞发送(send())和阻塞接收(recv()),配合所有权机制确保线程安全。该模式适合任务分发场景,主线程创建工作线程发送消息后统一收集结果,充分体现Rust在并发编程中的内存安全和高性能优势,编译期即可保证无数据竞争。
2025-09-03 13:51:35
53
翻译 Rust代码示例——20.1.线程
摘要:Rust通过std::thread模块支持原生OS线程操作。示例代码展示了如何创建10个线程(使用spawn和move闭包),将线程句柄存入向量,并通过join()等待所有线程完成。关键特性包括:真正的操作系统线程、所有权转移确保线程安全、join同步机制。相比异步/绿色线程,OS线程适合CPU密集型任务但开销较大。最佳实践建议控制线程数量,使用Arc和互斥锁处理共享数据,注意错误处理。该示例体现了Rust在并发编程中兼顾底层控制与线程安全的特性。(149字)
2025-09-02 11:17:21
43
翻译 Rust代码示例——20.标准库杂项
标准库提供了多种类型来支持线程、通道和文件读写等高级功能,扩展了基本类型的能力。这些工具增强了程序的并发性和I/O操作效率。
2025-09-02 11:13:52
31
翻译 Rust代码示例——19.9.Arc(原子引用计数)
摘要:Arc(原子引用计数)是Rust中用于多线程共享数据所有权的智能指针。它通过原子操作管理引用计数,确保线程安全地将数据存储在堆内存中。创建Arc会增加引用计数,克隆操作会原子性地增加计数并返回新指针。与Rc不同,Arc具有线程安全性但性能略低。典型应用场景包括多线程数据共享、并发数据结构和线程池实现。当所有引用离开作用域时,Arc会自动清理内存。示例代码展示了如何在10个线程中安全共享同一个Arc指针。
2025-09-01 15:31:19
77
翻译 Rust代码示例——19.8.Rc(引用计数)
Rc是Rust中用于实现多重所有权的智能指针,通过引用计数机制跟踪值的使用情况。当克隆Rc时仅增加引用计数而不深拷贝数据,当计数归零时自动清理内存。示例展示了Rc的创建、克隆、引用计数变化及值访问方式。Rc适用于单线程环境下共享数据所有权的场景,如构建复杂数据结构,但不支持线程安全或可变性操作,需注意循环引用风险。其核心特性包括浅拷贝、自动内存管理和不可变共享。
2025-09-01 15:10:08
56
翻译 Rust代码示例——19.7.2.HashSet
HashSet是基于HashMap实现的只存储键值的数据结构,其核心特性是保证元素唯一性。相比Vec,它提供了O(1)时间复杂度的查找性能,并支持四种集合运算:并集(union)、差集(difference)、交集(intersection)和对称差集(symmetric_difference)。HashSet适合需要去重、快速存在性检查或数据集比较的场景,使用时需注意元素需实现Eq和Hash特性,且迭代顺序不确定。这种数据结构在需要确保元素唯一性或进行集合运算时特别有用。
2025-09-01 14:44:35
34
翻译 Rust代码示例——19.7.1.更改/自定义键值类型
本文介绍了Rust中HashMap键类型的限制和要求。实现Eq和Hash接口的类型可用作键,包括布尔值、整数、字符串等,但f32/f64因精度问题不适用。通过#[derive(PartialEq,Eq,Hash)]可自动为自定义类型实现相关特性。文章以用户登录系统为例,展示了如何定义Account结构体作为键,使用HashMap存储账户信息,并演示了登录验证过程。关键点包括:自动派生特性简化实现、生命周期处理字符串引用、类型安全保证和模式匹配处理结果。
2025-09-01 11:10:59
39
翻译 Rust代码示例——19.7.哈希镜像(HashMap)
本文介绍了Rust中HashMap的基本特性和使用方法。HashMap是一种键值对存储结构,支持布尔值、整型、字符串等多种键类型,并可根据需要自动调整容量。文章通过示例代码展示了如何创建HashMap、插入/更新键值对、获取值(使用模式匹配)、删除键值对以及遍历操作。重点说明了insert方法返回None(新插入)或Some(value)(更新),get方法返回Option<&V>,以及iter方法返回无序键值对迭代器等关键行为。HashMap为Rust程序提供了灵活高效的键值存储解决方
2025-09-01 10:09:02
44
翻译 Rust代码示例——19.6.panic!
摘要:Rust的panic!宏用于处理不可恢复错误,触发线程终止和栈回退。示例演示了除零错误时的panic处理:当divisor为0时,调用panic!终止程序,执行栈回退并释放资源(如Box分配的内存)。单线程中panic会导致程序退出并打印错误信息。Rust通过逆序析构保证资源安全,与Result不同,panic适用于不可恢复错误。典型应用包括前置条件验证和测试断言,但需注意性能影响,嵌入式系统可配置为直接终止。该机制体现了Rust的内存安全原则。
2025-08-31 16:03:09
65
翻译 Rust代码示例——19.5.1.?操作符
本文介绍了Rust中使用?操作符简化错误处理的方法。通过对比展示了?操作符如何将嵌套的match表达式转换为线性代码结构,使错误处理更清晰。代码示例演示了数学运算中的错误处理,包括除法、对数和平方根的异常情况。?操作符会自动展开Result类型,成功返回值,失败则提前返回错误,并支持自动错误类型转换。这种改进使代码更简洁、可读性更强,同时保持了Rust错误处理的显式特性,适用于需要连续多个可能失败操作的场景。
2025-08-31 15:34:35
80
翻译 Rust代码示例——19.5.结果类型(Result)
Rust中的Result枚举类型用于处理可能失败的操作,能携带成功值或错误信息。代码展示了如何定义MathError枚举表示数学错误,并使用Result<f64, MathError>作为返回类型。通过三个安全运算函数(除法、对数、平方根)演示错误处理,最终在op函数中嵌套match实现链式操作。当计算√(ln(1.0/10.0))时会因负数平方根而panic。这种处理方式虽显式但易形成嵌套金字塔,实际可用?运算符优化。
2025-08-31 15:04:45
76
翻译 Rust代码示例——19.4.可选项(Option)
本文介绍了Rust中使用Option枚举处理可能失败操作的方法。通过checked_division函数展示了如何用Option<T>(Some/None)安全处理除零错误,避免panic。文章重点解析了模式匹配处理Option、None类型注解、unwrap()方法的风险,并建议使用更安全的替代方案。最后指出Option枚举强制显式处理缺失值的优势,是Rust避免空指针错误的核心机制。
2025-08-28 17:55:00
108
翻译 Rust代码示例——19.3.字符串
本文介绍了Rust中的字符串处理,主要涉及两种类型:String(堆分配、可增长的UTF-8字符串)和&str(字符串切片)。演示了字符串反转、字符排序去重、动态构建字符串等操作。详细说明了字符串字面量的转义规则,包括十六进制和Unicode转义。特别介绍了字节字符串(b前缀)的处理,包括原始字节字符串(br前缀)、编码转换(str::from_utf8)以及非UTF-8数据的处理注意事项。文章强调常规字符串必须保证UTF-8有效性,而字节字符串更适合处理二进制数据或混合文本。
2025-08-28 17:34:45
79
Rust代码示例,是学习Rust语言的最佳向导 本文翻译自Rust的官方文档:Rust By Example
2025-09-10
使用ActiveMQ 5.X
2012-02-14
信息系统项目管理师教程
2014-05-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅