Rust宏示例和实践【译】

原文链接为 https://earthly.dev/blog/rust-macros/ ,文章大部分使用机器翻译,小部分进行了文字调整。 本文深入探讨 Rust 宏的强大功能和多功能性。 Earthly 保证构建过程与您创建的宏一样强大。了解更多关于地球的信息。 在 Rust 中,宏是使用通常称为元编程的技术生成其他 Rust 代码的代码片段。宏在编译期间被扩展,并且宏的输出被插入到程序的源代码中。 最著名的宏示例是 println! 。尽管它看起来像函数并且使用起来也像函数,但它实际上在编译过程中进行了扩展,并且 println! 调用被替换为更复杂的实现代码。 在本文中,您将看到一些宏的实际示例,并了解一些有关如何最好地使用它们的提示和技巧。 Rust 宏基础知识 本教程假设您熟悉 Rust 编程的基础知识。 在 Rust 中,有两种类型的宏:声明性宏和过程性宏。逐一查看: 声明性宏 声明性宏是最简单的宏类型,由 macro-rules! 宏定义。它们的外观和行为与 match 表达式类似。 match 表达式将表达式作为输入,并将其与一组预定义模式进行匹配并运行相应的代码。类似地,声明性宏将一段 Rust 源代码作为输入,将源代码与一组预定义的结构进行匹配,并且在成功匹配时,将代码替换为与匹配模式关联的代码。 以下示例显示了正在运行的声明性宏: declarative_macro.rs//declarative_macro.rs macro_rules! greetings { ($x: expr) => { println!("Hello, {}", $x); }; } fn main() { greetings!("Earthly"); // Prints "Hello, Earthly" } 这里,宏被命名为 greetings 并用 macro_rules! 定义。在宏主体中,只有一种模式: ($x: expr) => { ....

在 Rust 中使用 Serde【译】

本文原文链接为 https://www.shuttle.rs/blog/2024/01/23/using-serde-rust 。大部分使用机器翻译,个人对机器翻译内容进行了部分润色,对于部分内容进行了增补。 在本文中,我们将讨论 Serde、如何在 Rust 应用程序中使用它以及一些更高级的提示和技巧。 什么是serde? serde Rust create用于高效地序列化和反序列化多种格式的数据。它通过提供两个可以使用的trait来实现这一点,恰当地命名为 Deserialize 和 Serialize 。作为生态系统中最著名的 crate 之一,它目前支持 20 多种类型的序列化(反序列化)。 首先,您需要将 crate 安装到您的 Rust 应用程序中: cargo add serde 使用serde 反序列化和序列化数据 序列化和反序列化数据的简单方法是添加 serde derive 功能。这会添加一个宏,您可以使用它来自动实现 Deserialize 和 Serialize - 您可以使用 --features 标志( -F 来实现)短的): cargo add serde -F derive 然后我们可以将宏添加到我们想要实现 Deserialize 或 Serialize 的任何struct体或enum(枚举)中: use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] struct MyStruct { message: String, // ... the rest of your fields } 这允许我们使用任何支持 serde 的包在所述格式之间进行转换。作为示例,让我们使用 serde-json 与 JSON 格式相互转换:...

转换数字到Excel列字母实现

根据微软官方文档,excel最大支持1,048,576 行, 16,384 列。下面的代码并未处理这一限制。 Rust 实现代码: fn convert_to_title(mut n: i32) -> String { let mut result = String::new(); while n != 0 { n -= 1; let letter = (n % 26) as u8 + b'A'; result.insert(0, letter as char); n /= 26; } result } #[test] fn test_convert_to_title() { let aa = convert_to_title(27); assert_eq!(aa, "AC"); } Go 实现代码: func convertToTitle(n int) string { result := "" for n > 0 { n-- letter := n%26 result = string('A'+letter) + result n /= 26 } return result } C# 实现代码:...

一些Rust的学习资料

在线教程 concurrency programming via rust https://blog.fudenglong.site/Programming-Rust/ jetbrains出品的rust教程 Rust Book experiment 微软出品:写给.net开发人员的Rust教程 Google Android团队写的Rust教程 通过例子学rust https://cheats.rs/ Rust语言圣经 Brown 大学版本rust程序设计实验版 learn how to write macros in Rust Operating System development tutorials in Rust on the Raspberry Pi Rust语言实战 inside rust std library A Plugin System in Rust https://learning-rust.github.io https://github.com/CleanCut/ultimate_rust_crash_course Writing a JVM in Rust Rust 宏小册 Writing an OS in Rust 清华大学程序设计训练(Rust) Rust 异步编程指南 rust ffi guide Rust基础教程 rCore-Tutorial-Book 第三版 OffensiveRust RustPrimer Rust Atomics and Locks中文版 Rust 程序设计语言 2021版 中文 The Rust on ESP Book中文版 rust 教程资料收集 - fkysly case studies Y分钟速成X=Rust Rust 101 https://teach-rs....

Rust安装及配置

下载rustup 从此处下载,如果你需要安装vs的cpp生成工具,可以在这个页面进行下载。 设置rustup镜像 字节提供的镜像 https://rsproxy.cn export RUSTUP_DIST_SERVER="https://rsproxy.cn" export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup" 设置两个环境变量即可。windows可以使用下面的命令进行设置: setx RUSTUP_DIST_SERVER "https://rsproxy.cn" setx RUSTUP_UPDATE_ROOT "https://rsproxy.cn/rustup" 中科大 设置环境变量 RUSTUP_DIST_SERVER (用于更新 toolchain) export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static 以及 RUSTUP_UPDATE_ROOT (用于更新 rustup) export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup 华中科技大学 **方法一:**在“系统-高级系统设置-环境变量” 中增加环境变量。 变量名为 RUSTUP_DIST_SERVER,值为https://mirrors.hust.edu.cn/rustup。 变量名为 RUSTUP_UPDATE_ROOT,值为https://mirrors.hust.edu.cn/rustup/rustup。 **方法二(推荐):**直接执行下面的Powershell脚本: [System.Environment]::SetEnvironmentVariable("RUSTUP_DIST_SERVER", "https://mirrors.hust.edu.cn/rustup", "User") [System.Environment]::SetEnvironmentVariable("RUSTUP_UPDATE_ROOT", "https://mirrors.hust.edu.cn/rustup/rustup", "User") 设置RUSTUP_HOME和CARGO_HOME可以实现自定义安装路径 对于使用buf的开发者,需要添加下面的内容: [registries.buf] index = "sparse+https://buf.build/gen/cargo/" credential-provider = "cargo:token" 然后登陆,token可以从这里获取 cargo login --registry buf "Bearer {token}" 更多内容,请参考https://buf.build/docs/bsr/generated-sdks/cargo crates.io 镜像 编辑 ~/.cargo/config ,这里使用的是中科大的镜像。 cargo版本 1.39 中添加了对 .toml 扩展的支持,并且是首选形式。如果两个文件都存在,Cargo 将使用不带扩展名的文件。...