Rust
文章平均质量分 56
Rust 程序设计入门与应用。
许野平
非常喜欢软件设计这份工作,有不错的数学基础,喜欢读书、摄影与音乐。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
函数式编程“闭包”概念深入解析
闭包是函数与定义时的词法环境组合体,能记住外部变量状态。它具有状态保持、词法作用域绑定等特性,广泛应用于封装私有变量、回调函数等场景。不同语言对闭包支持程度不同,使用时需注意性能问题和循环陷阱。闭包通过绑定词法环境实现状态持久化和数据封装,是现代编程的重要工具。原创 2025-08-20 17:14:20 · 837 阅读 · 0 评论 -
Rust:实现仅通过索引(序数)导出 DLL 函数的功能
本文介绍了在Rust中隐藏DLL函数名、仅通过序数导出的方法。通过创建.def模块定义文件,结合MSVC链接器参数/DEF:exports.def /EXPORT:NONE,使用NONAME关键字强制序数导出。步骤包括:配置cdylib项目、编写#[no_mangle]函数、创建.def文件分配序号、设置链接参数,最后验证生成仅包含序数导出的DLL。该方法仅适用于MSVC工具链,可有效保护内部符号名称,调用方需通过GetProcAddress按序数加载函数。原创 2025-08-17 23:08:01 · 715 阅读 · 0 评论 -
Rust:DLL 输出对象的生命周期管理
本文介绍了在Rust开发DLL时安全传递对象地址给C语言的完整方案。核心是通过Box::into_raw泄漏所有权,由C调用方显式管理生命周期,并提供销毁函数。示例展示了一个线程安全的计数器实现,使用Mutex保证内部可变性。关键措施包括:所有权转移协议、空指针检查、FFI兼容内存布局(repr(C))。同时建议使用RAII封装管理生命周期、避免跨DLL析构、保持版本兼容性。对于共享所有权场景,可选用Arc引用计数方案。最佳实践推荐使用abi_stable库、自动化测试工具和内存分析工具来确保安全性。原创 2025-08-17 13:33:33 · 469 阅读 · 0 评论 -
Rust 中 &i32 与 *i32 的深度解析
Rust 中 &i32 和 *i32 是两种关键指针类型,存在本质区别。&i32 是安全的引用,由编译器保证内存安全,自动管理生命周期,禁止空值,严格遵循借用规则;而 *i32 是不安全的裸指针,需要手动管理,允许空值,主要用于 FFI 和底层操作,必须在 unsafe 块中使用。虽然 &i32 可安全转换为 *i32,但反向转换需要显式不安全操作。日常开发应优先使用 &i32,仅在特定场景(如 C 交互或极端性能优化)才考虑 *i32。原创 2025-08-15 22:24:41 · 1278 阅读 · 4 评论 -
Rust 中 Box 的深度解析:作用、原理与最佳实践
Rust中的Box是核心智能指针,主要用于堆内存分配、所有权转移和解决递归类型问题。它将数据从栈移到堆,适用于大型数据或需要延长生命周期的场景。Box实现独占所有权和自动释放,编译后效率与手动管理相同。关键应用场景包括处理递归数据结构、实现trait对象、优化大数据传递和构建复杂类型。相比其他智能指针,Box开销最小但不支持共享所有权。最佳实践建议优先使用栈分配,必要时采用Box来防止栈溢出或减少复制开销。Box体现了Rust零成本抽象与安全内存管理的核心设计理念。原创 2025-08-15 21:44:09 · 1564 阅读 · 0 评论 -
Rust:构造函数 new() 如何进行错误处理?
Rust 中 new() 方法的错误处理主要有三种方式:1) 返回 Result<T,E>(推荐处理可恢复错误),2) 使用 panic!(仅适用于不可恢复错误),3) 返回 Option<T>(简化处理)。最佳实践是根据场景选择方案:Result 适合需要详细错误信息的输入校验,panic! 用于代码逻辑错误,Option 适用于简单存在性检查。关键原则是显式处理错误、避免隐藏错误,并利用类型系统和错误 trait(如 thiserror)提升代码健壮性。原创 2025-08-12 17:29:28 · 337 阅读 · 0 评论 -
Rust:专业级错误处理工具 thiserror 详解
Rust错误处理库thiserror详解:专为库开发设计,支持自定义错误类型和自动特征实现。通过#[derive(Error)]宏可快速定义包含格式化错误信息、错误来源和回溯的枚举或结构体错误类型。相比anyhow更适合需要精确错误控制的场景,支持模式匹配和高效错误处理。文章涵盖安装、核心功能、属性详解、最佳实践及与anyhow的对比,是库开发者提升错误处理能力的实用指南。原创 2025-08-11 17:07:03 · 1313 阅读 · 0 评论 -
Rust:anyhow 高效错误处理库核心用法详解
本文详细介绍了Rust中anyhow库的核心用法,它专为简化错误处理设计,特别适合快速原型开发和需要丰富错误上下文的场景。文章从基础错误处理、错误创建、链式回溯到自定义错误转换,全面解析了anyhow的功能,并提供了动态上下文、结果类型简化等进阶技巧。同时指出了在库开发、性能影响等方面的注意事项,最后通过实用代码示例和调试技巧展示了最佳实践。使用anyhow能显著减少错误处理样板代码,推荐结合?操作符和上下文包装来提升代码质量。原创 2025-08-11 16:51:58 · 817 阅读 · 0 评论 -
Rust 库开发全面指南
/!这是一个数学计算库//!//!提供各种数学计算功能/// 计算两个数的和////// # 示例/// ```////// ```a + b/// 计算阶乘/// 自定义错误类型/// 安全除法} else {Ok(a / b)原创 2025-08-11 14:08:54 · 773 阅读 · 0 评论 -
使用 Rust 创建 32 位 DLL 的完整指南
本文详细介绍了使用Rust创建32位DLL的完整流程。主要内容包括:环境准备(安装Rust工具链和32位目标)、项目配置(Cargo.toml设置)、DLL代码编写规范(extern "C"和#[no_mangle]使用)、两种编译方式(GNU和MSVC ABI)、头文件创建、C++调用示例,以及高级主题如结构体处理、回调函数和错误处理。文章还提供了构建优化建议(减小DLL体积)和调试技巧,并总结了内存管理、ABI兼容性和线程安全等常见问题的解决方案。原创 2025-08-11 10:33:52 · 521 阅读 · 0 评论 -
Rust:如何开发32位的DLL动态库
这篇教程演示了如何用Rust创建32位DLL并在C++中调用。主要步骤包括:1)添加32位工具链;2)配置Cargo.toml为cdylib;3)实现导出函数(DllMain、calculate、to_uppercase等);4)处理跨语言内存管理;5)编译为32位DLL。配套提供了C++测试代码,展示如何加载DLL、调用函数并处理回调。关键点包括使用no_mangle标记导出函数、正确内存管理约定以及32位兼容性。原创 2025-08-04 09:33:38 · 1118 阅读 · 0 评论 -
Rust: 获取 MAC 地址方法大全
Rust中获取MAC地址需使用第三方库如mac_address,标准库不提供此功能。文章详细展示了多种方法:获取所有/特定接口MAC地址、过滤虚拟接口、格式化输出,并处理跨平台兼容性问题(Windows/macOS/Linux)。还包括错误处理、重试机制和实用函数如MAC地址验证。代码示例涵盖基础到高级用法,如通过注册表获取Windows MAC地址、自定义错误类型等,为不同场景提供全面解决方案。原创 2025-08-03 19:13:15 · 625 阅读 · 0 评论 -
Rust 同步方式访问 REST API 的完整指南
Rust同步访问REST API简明指南 本文介绍了使用Rust以同步方式访问REST API的完整方案。内容涵盖: 核心依赖:推荐使用reqwest的blocking特性配合serde进行JSON处理 基本请求:包括GET获取文本/JSON数据,以及POST发送JSON/表单数据 高级功能:请求头设置、超时控制和分页处理 错误处理:自定义错误类型的最佳实践 同步方案特别适合简单应用和脚本场景,避免了异步编程的复杂性,同时仍能提供完整的API访问能力。文中包含可直接使用的代码示例,展示了从基础到进阶的各种A原创 2025-08-03 18:53:49 · 547 阅读 · 0 评论 -
Rust:如何访问 *.ini 配置文件?
Rust INI 文件处理摘要 Rust 提供了 configparser 和 ini 两个主流库处理 INI 文件: configparser (功能全面) 支持自动类型转换 (getint/getbool) 完整的注释处理 多行值支持 提供默认值机制 ini (轻量高效) 更简洁的 API 基本注释保留 自定义分隔符支持 性能更优 典型用法包括: 读写键值对和节(section) 处理注释和多行值 类型安全转换 错误处理 推荐根据项目需求选择: 复杂配置用 configparser 简单场景用 ini原创 2025-08-03 14:33:29 · 434 阅读 · 0 评论 -
Rust:神奇的 anyhow 自动错误类型转换
anyhow库通过Rust的trait系统和?运算符实现自动错误类型转换。其核心机制包括:1) anyhow::Result固定错误类型为anyhow::Error;2) Error类型作为错误容器,通过From trait自动转换实现了std::error::Error的错误类型;3) ?运算符根据返回类型自动调用转换逻辑。该设计还支持错误上下文扩展,通过Box<dyn Error>实现类型擦除,但需注意仅适用于实现了Error trait的类型,且存在堆分配开销。这种机制大幅简化了错误处理代原创 2025-08-03 14:15:20 · 407 阅读 · 0 评论 -
Rust:开发 DLL 动态链接库时如何处理 C 字符串
本文详细介绍了Rust开发DLL时处理C字符串与Rust String相互转换的安全方法。主要内容包括:1)将C字符串(const c_char)安全转换为Rust String;2)将Rust String转换为C可用的mut c_char指针;3)完整DLL示例与C调用方式;4)高级技巧如错误处理、多字节编码转换和复杂数据结构返回。重点强调了内存安全、所有权管理和错误处理,提供了空指针检查、线程安全等最佳实践,并警告了常见陷阱。最后建议使用cbindgen自动生成头文件,确保跨语言调用的安全性。原创 2025-08-03 13:05:02 · 790 阅读 · 0 评论 -
Rust:如何开发Windows 动态链接库 DLL
Rust创建Windows DLL动态库的完整指南 本文详细介绍了使用Rust创建兼容C的Windows DLL动态库的全过程: 项目配置 通过cargo new --lib创建项目 在Cargo.toml中设置crate-type = ["cdylib"] 添加windows crate依赖项 核心实现 使用#[no_mangle]和extern "C"确保函数导出兼容性 演示了基本数值运算、字符串处理和结构体操作 提供了必须的字符串内存管理函数 编译与调用 使用c原创 2025-08-03 10:51:25 · 668 阅读 · 0 评论 -
Rust: 工具链版本更新
摘要: 解决 cargo build --release 因 Rust 工具链版本过低(如 1.78.0)导致依赖不兼容(如要求 ≥1.82.0)的问题,提供三种方案: 升级工具链(推荐):执行 rustup update 升级至兼容版本(如 1.83.0),一劳永逸; 降级依赖(临时方案):通过 cargo update 或修改 Cargo.toml 指定旧版本依赖,但需逐项验证兼容性; 锁定工具链版本:通过 rust-toolchain 文件指定高版本 Rust。 建议优先升级工具链,避免降级 ICU原创 2025-08-02 12:25:16 · 1278 阅读 · 0 评论 -
Rust:anyhow::Result 与其他 Result 类型转换
Rust中处理不同Result类型的方法总结:1. 显式转换:用map_err将其他错误转为anyhow::Error;2. 自动转换:为自定义错误实现From以支持?操作符;3. 统一类型:用Box<dyn Error>或直接返回anyhow::Result来兼容异构错误。关键建议:优先使用?自动传播错误,需定制错误时结合map_err或From实现,第三方库错误可通过装箱或实现From来整合。最终保持错误处理简洁统一,同时支持添加上下文信息。原创 2025-07-29 17:46:43 · 875 阅读 · 0 评论 -
Rust:高效错误处理工具 anyhow
Rust的anyhow库简化了应用程序的错误处理,通过统一错误类型和便捷API减少模板代码。核心功能包括:1) 使用anyhow::Result统一错误类型;2) 通过Context添加错误上下文信息;3) 自动错误传播;4) 提供bail!快速返回错误等实用工具。与thiserror相比,anyhow更适合应用程序开发,而thiserror更适用于库开发。典型用法结合文件操作和错误链式处理,显著提升代码可读性和调试效率。最佳实践建议应用开发优先使用anyhow,敏感场景避免泄露信息。原创 2025-07-29 17:17:08 · 984 阅读 · 0 评论 -
Rust:如何动态调用字符串定义的 Rhai 函数?
在 Rust 中使用 Rhai 脚本引擎时,你可以动态地调用传入的字符串表示的 Rhai 函数。Rhai 是一个嵌入式脚本语言,专为嵌入到 Rust 应用中而设计。以下是一个基本示例,展示了如何在 Rust 中调用用字符串传入的 Rhai 函数。结构体来存储函数名和参数,然后构建了一个临时的 Rhai 脚本,该脚本根据函数名和参数数量调用相应的 Rhai 函数。这种方法提供了更大的灵活性,但也更复杂,并且需要处理更多的错误情况。一个更健壮的方法是使用 Rhai 的。在这个更通用的示例中,我们定义了一个。原创 2025-01-26 19:04:40 · 981 阅读 · 0 评论 -
Rust:Rhai脚本编程示例
这个示例展示了如何在Rust中使用Rhai执行简单的脚本,并访问脚本中的函数和变量。你可以根据需要扩展这个示例,添加更多的Rhai脚本功能,或者将Rhai集成到你的Rust应用程序中以实现更复杂的动态脚本支持。当然,以下是一个简单的Rhai脚本编程示例,展示了如何在Rust中使用Rhai执行脚本。接下来,你可以编写一个Rust程序来执行Rhai脚本。首先,你需要确保你的Rust项目中包含了。原创 2025-01-26 18:45:00 · 777 阅读 · 0 评论 -
在Rust应用中访问.ini格式的配置文件
在Rust应用中访问.ini格式的配置文件,你可以使用第三方库,比如ini或config. 下面是一个使用ini库的示例,该库允许你读取和解析.ini文件。原创 2025-01-25 16:21:03 · 804 阅读 · 0 评论 -
Rust:指针 `*T` 和引用 `&T`的区别
是一个安全、受 Rust 借用检查保护的不可变引用类型。在编写 Rust 代码时,应优先考虑使用安全的引用类型。是两种不同类型的指针,它们各自代表了不同的内存访问方式和所有权模型。,并始终注意确保内存安全性和避免潜在的未定义行为。是一个原始、不安全的指针类型,而。,只有在确实需要时才使用原始指针。在 Rust 编程语言中,原创 2025-01-15 19:10:55 · 925 阅读 · 0 评论 -
Rust:运行调用 Lua 脚本
此外,如果你需要运行异步Lua代码,可以考虑使用rlua-async库。然后,在你的Rust代码中,可以使用rlua模块(假设rust-lua库在Cargo中注册的名称是rlua,实际使用时请确认)来运行Lua程序。请注意,由于rust-lua库的具体实现和API可能会随着版本的更新而发生变化,因此在实际使用时,请务必参考该库的最新文档和示例代码。并调用它来打印结果。最后,我们通过调用Lua函数来计算两个数字的和,并将结果打印出来。首先,确保你的Rust项目中已经添加了rust-lua库的依赖。原创 2025-01-06 18:20:11 · 950 阅读 · 0 评论 -
Rust: enum 和 i32 的区别和互换
在Rust编程语言中,enum(枚举)和i32是两种不同类型的数据结构,它们各自有不同的用途和特性。i32是一个32位的有符号整数类型。它用于存储整数值,范围从-2,147,483,648到2,147,483,647。i32是Rust中的基本数据类型之一,广泛用于需要整数运算的场景。enum。原创 2024-12-25 17:42:17 · 932 阅读 · 0 评论 -
Rust:AtomicI8 还是 Mutex<u8>?
提供的原子操作(如加载、存储等)在硬件层面得到支持,这些操作是不可分割的,即一旦开始执行,就不会被其他线程的操作打断。如果需要在多个线程之间安全地传递复杂的数据结构或进行复杂的同步操作,那么可能需要考虑使用更复杂的并发控制机制(如锁、条件变量等)。综上所述,虽然AtomicI8在理论上可以用于高并发场景,但其在高并发下的性能可能受到多种因素的影响。)在理论上是可以用于高并发场景的,但其在高并发下的性能可能不如位宽更大的原子类型或某些锁机制。在选择时,应根据具体的应用需求和性能要求来做出合适的选择。原创 2024-11-17 18:09:01 · 1186 阅读 · 0 评论 -
Rust:原子操作 AtomicBool
在 Rust 中,你可以使用 std::sync::atomic 模块来进行原子操作。Ordering::Relaxed 表示内存排序约束较弱,适用于不需要严格排序的场景。Ordering::SeqCst:顺序一致性,最强的排序约束,确保所有线程以相同的顺序看到操作。在原子操作中,内存排序 (Ordering) 决定了操作的内存可见性和顺序。Ordering::Relaxed:最弱的排序约束,适用于不需要严格排序的场景。选择适当的内存排序约束可以提高性能,但也要确保满足你的并发需求。再次读取值以确认更改。原创 2024-11-17 17:13:30 · 926 阅读 · 0 评论 -
Rust: 原子操作大全
Rust 的原子操作主要通过模块提供。这些原子操作对于多线程编程至关重要,因为它们能够确保操作的原子性和内存可见性,从而避免数据竞争和其他并发问题。原创 2024-11-17 17:12:21 · 1541 阅读 · 0 评论 -
Rust:GUI 开源框架
在选择Rust的GUI代码包时,建议根据自己的项目需求、目标平台、性能要求以及个人偏好来进行选择。每个库都有其独特的优点和适用场景,选择最适合自己的库可以大大提高开发效率和应用程序的质量。Rust的GUI代码包有多个选择,每个都有其独特的特点和优势。原创 2024-11-11 19:38:06 · 1449 阅读 · 0 评论 -
Rust:启动与关闭线程
在 Rust 编程中,启动和关闭线程是并发编程的重要部分。Rust 提供了强大的线程支持,允许你轻松地创建和管理线程。下面将详细解释如何在 Rust 中启动和关闭线程。原创 2024-11-08 17:59:05 · 1042 阅读 · 0 评论 -
Rust: 利用 chrono 库实现日期和字符串互相转换
在 Rust 中,日期和字符串之间的转换通常涉及chrono库,这是一个功能强大的日期和时间处理库。以下是如何在 Rust 中将日期转换为字符串以及将字符串转换为日期的示例。首先,你需要在你的Cargo.toml文件中添加chrono然后,你可以在你的 Rust 代码中使用chrono库来进行日期和字符串之间的转换。原创 2024-11-07 17:12:11 · 930 阅读 · 0 评论 -
Rust: 加密算法库 ring 如何用于 RSA 数字签名?
本来用 rsa 库基本搞定,但文心一言建议改用 ring 库。原因是 rsa 库已经放弃维护,而 ring 库性能公认很好。但是如何进行 RSA 数字签名,网上几乎查不到这方面材料。仔细查看了 ring 库的源代码和代码注释,终于完成趟坑。总结一下供大家参考。原创 2024-10-31 21:32:11 · 2086 阅读 · 0 评论 -
Rust:Vec<u8> 与 [u8] 之间的转换
在 Rust 中,Vec是一个动态数组,而&[u8]是一个指向字节切片的不可变引用。这两者之间经常需要进行转换,因为它们在处理字节数据时非常常见。原创 2024-10-31 15:01:24 · 1318 阅读 · 0 评论 -
Rust:文档注释 //! 和 ///
是 Rust 的官方文档生成器,它可以从源代码中的这些文档注释生成 HTML 或 Markdown 格式的 API 文档,这对于项目的维护和向其他开发者展示 API 非常有用。是一种特殊的文档注释(documentation comment)。它用于为整个模块、结构体、枚举、函数或其他项提供文档说明。(用于紧跟在项之前的文档注释)会被 Rust 的文档工具。生成文档时,这段注释会出现在模块的文档中。注释为整个模块提供了文档说明。捕获,并用于生成 API 文档。在 Rust 编程语言中,原创 2024-10-30 12:14:14 · 623 阅读 · 0 评论 -
Rust:设计 gRPC 客户端
在 Rust 中编写 gRPC 客户端,你可以使用tonic库,它与 gRPC 协议兼容,并提供了方便的 API 来创建客户端。以下是一个简单的步骤指南,教你如何使用 Rust 编写一个 gRPC 客户端。原创 2024-10-28 12:19:29 · 1037 阅读 · 0 评论 -
Rust:如何设计 gRPC 服务器
gRPC 使用 Protocol Buffers 定义服务和消息。创建一个.proto文件,例如。原创 2024-10-28 12:09:15 · 794 阅读 · 0 评论 -
Rust: [u8] 与 String 相互转换
使用将有效的 UTF-8 字节数组转换为String。使用将可能不是有效 UTF-8 的字节数组转换为String,但会替换无效字节。使用获取&[u8]切片。使用将String转换为Vec。这些方法应满足你在 Rust 中处理String和[u8]相互转换的大部分需求。原创 2024-10-23 15:47:39 · 1152 阅读 · 0 评论 -
Rust: AES 加密算法库
在Rust中,进行AES加密通常会用到一些现有的库,因为Rust标准库中并不直接提供AES加密的API。使用这些代码,你可以开始在你的Rust项目中实现AES加密。确保你理解每个步骤的安全性和性能影响。请注意,版本号可能会随着时间推移而更新,请查看最新的crates.io信息。库已标记为不再维护,但仍有大量项目在使用)或更现代的。库由于依赖问题有时可能难以编译,另一个常用的库是。的Rust绑定,但直接支持AES的常用库是。库进行AES加密的示例。这里,我将给出一个使用。原创 2024-09-19 16:45:13 · 1417 阅读 · 0 评论 -
Rust 编译器使用的 C++ 编译器吗?
Rust编译器,但它们之间可以存在交互,尤其是在Rust与C++进行混合编程时。原创 2024-09-14 11:27:41 · 1105 阅读 · 0 评论
分享