宏 在 rust 中,我们一开始就在使用宏,例如 println!, vec!, assert_eq! 等。看起来宏和函数在使用时只是多了一个 !。 实际上这些宏都是声明式宏(也叫示例宏或macro_rules!),rust 还支持过程宏,过程宏为我们提供了强大的元编程工具。 声明式宏 声明式宏类似于 match 匹配。 而 Rust 编译器会自动处理变量名和作用域,确保宏展开后的代码不会引入未预料的变量冲突。下面是一个C/C++中使用宏的例子。 这也是rust的宏是 Hygienic Macros 的体现。 , v); 我们在使用宏的时候,可以使用(), [], {},都是可以的。但是一般都是按照约定成俗的方式来使用。例如:vec![1,2,3],而不是使用 vec!{1,2,3}。
Rust之所以难,这也有很大的关系,把宏设计的比传统的宏要复杂一些,在记忆中宏就是代码替换,但Rust已经超出了这个定义。3年前,你在学习Rust,3年后,你还在学习Rust,可见Rust入坑要谨慎。 Rust宏的分类声明式宏和函数宏可以简单的理解为代码替换,也可以理解为传统的宏。声明式宏和过程宏的区别声明式宏按模式去匹配进行代码模板替换。按常规理解就行。 [1, 2, 3] 或 vec![0; 5]最常用的集合宏断言和测试宏宏名用途示例说明assert!条件断言assert!(x > 0);条件为假时 panicassert_eq! ("SELECT").from("users")动态查询构建r2d2::r2d2!r2d2连接池r2d2! (config)数据库连接池UI 框架过程宏(Rust GUI)宏名所属框架用途示例说明#[component]yewYew 组件#[function_component] fn Comp()WebAssembly
过程宏是rust里的强大的武器,非常值得学习rust的人去掌握。但过程宏的编写有点难度,且文档也不太详细,最近也专门学习了下过程宏,算是有点收获,写下一点东西。 2、Quote 应用比较简单,适合使用。 3、proc_macro2 更好的proc_macro更方便的接口,能和syn、quote一起更好的配合应用。 什么是过程宏? 过程宏(Procedure Macro)是Rust中的一种特殊形式的宏,它将提供比普通宏更强大的功能。方便起见,本文将Rust中由macro_rules!定义的宏称为规则宏以示区分。 结语 过程宏确实是rust里的黑魔法,希望这篇文章能帮助到一些人了解并使用过程宏,体会到rust的强大。 实例代码可以在这里看到。 0.6, proc-macro2 0.4.
概念 在编写过程宏时,经常需要对TokenStream 进行解析和处理。 而Syn库就是专门用于对TokenStream进行解析。 Syn is a parsing library for parsing a stream of Rust tokens into a syntax tree of Rust source code. Syn 用于将Rust tokens 解析为Rust 源码语法树。 实践 在过程宏使用Syn解析的流程: 定义自己存储结构 实现syn::parse::Parse 使用parse_macro_input!()生成源码树。 使用过程宏为struct添加hello方法: 使用parse_macro_input 解析到DeriveInput 获取struct name TokenStream 使用quote!
宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。 本篇博客将深入探讨Rust中的声明宏,包括声明宏的定义、声明宏的特点、声明宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust声明宏的魔力。 1. 声明宏在编译期间执行:声明宏在编译期间执行,而不是运行时执行。这意味着宏生成的代码在编译时就已经确定,不会增加运行时的性能开销。 2. 结论 本篇博客深入探讨了Rust中的声明宏,包括声明宏的定义、声明宏的特点、声明宏的使用方法,以及一些实际场景中的应用案例。 声明宏是Rust中强大的元编程工具,通过模式匹配和代码生成,它使得代码更加灵活、易读和简洁。希望通过本篇博客的阐述,读者对Rust声明宏有了更深入的了解,并能在实际项目中灵活运用。谢谢阅读!
Rust那些事之过程宏 1.过程宏 过程宏是一种扩展Rust编译器和提供可用于扩展该语言的插件的方法。 2.derive宏 使用侧: #[derive(StructShow)] pub struct Point { x: f64, y: f64 } 我们需要使用proc-macro来实现该功能 将rust语法转位TokenStream返回给编译器即可。 fn transform_stream(input: proc_macro2::TokenStream) -> proc_macro2::TokenStream { let ast: ItemStruct ("{}", p); 今天写的这个例子比较简单,过程宏功能很强大,后续继续研究,期待一起探讨~ 本节完~
概念 宏的作用就是在编译期间对原代码进行扩展,实现目标功能。简单的说宏就是生成代码的代码。 . — The Rust Reference (你可以简单认为,过程宏是一个将原有AST语法树转换为另外一个AST语法树的函数) 个人理解,Rust 宏相比C++中的宏定义, 它提供了一种可用让开发人员更容易介入代码编译过程的入口 Rust 过程宏定义分三种 #[proc_macro] 函数似宏 和macro_rules! 2. #[proc_macro_derive(Name)] 派生宏 用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait) 3. [dependencies] # quote = "1.0.9" # 目前没用到,先注释了 # proc-macro2 = "1.0.27" # syn = {version
属性宏允许开发者在代码上方添加自定义的属性,并对代码进行定制化处理。在本篇博客中,我们将深入探讨Rust中的属性宏,包括属性宏的定义、使用方法以及一些实际应用案例,以帮助读者充分了解属性宏的魅力。 属性宏的基本概念 1.1 属性宏的定义 在Rust中,属性宏是一种特殊的宏,它允许开发者在代码上方添加自定义的属性,并在编译期间对代码进行处理。 1.2 属性宏的特点 属性宏在Rust中具有以下几个特点: 代码定制化处理:属性宏允许开发者在代码上方添加自定义的属性,并根据属性的输入对代码进行定制化处理。 代码安全性:属性宏生成的代码必须是合法的Rust代码,它们受到Rust编译器的类型检查和安全检查。这保证了宏生成的代码不会引入潜在的编译错误和安全漏洞。 2. 希望通过本篇博客的阐述,读者对Rust属性宏有了更深入的了解,并能在实际项目中灵活运用。谢谢阅读!
本篇博客将深入探讨Rust中的宏,包括宏的定义、宏的分类、宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust宏的神奇之处。 1. 2. 声明宏(macro_rules!宏) 2.1 基本示例 让我们从一个简单的例子开始,创建一个打印消息的宏。 macro_rules! (1, 2, 3, 4, 5); println! Rust宏的应用案例 Rust宏在实际开发中有许多应用案例,以下是一些常见的应用场景: 5.1 DRY原则(Don’t Repeat Yourself) 宏可以帮助我们遵循DRY原则,减少代码的重复编写 (Point2D, 10, 20); fn main() { let p = Point2D::new(10, 20); println!
在本篇博客中,我们将深入探讨Rust中的派生宏,包括派生宏的定义、使用方法以及一些实际应用案例,以帮助读者充分了解派生宏的魅力。 1. 派生宏的基本概念 1.1 派生宏的定义 在Rust中,派生宏是一种特殊的宏,它允许开发者为自定义的数据类型自动实现trait。 代码安全性:派生宏生成的trait实现代码必须是合法的Rust代码,它们受到Rust编译器的类型检查和安全检查。这保证了派生宏生成的trait实现不会引入潜在的编译错误和安全漏洞。 2. 派生宏的局限性 虽然派生宏在Rust中非常强大,但它也有一些局限性需要注意: trait的限制:派生宏只能自动实现由Rust标准库或第三方库定义的trait,无法自动实现用户自定义的trait。 总的来说,派生宏为Rust开发者提供了一种强大的元编程工具,使得代码生成和转换变得简单高效。
场景开发过程宏时经常需要处理结构体或枚举体上的属性参数,如下 Command 结构体的 args 字段有属性 each = "arg",#[derive(Builder)]pub struct Command arguments: PathArguments::AngleBracketed { colon2_ ], }, }, }, // 其它字段省略 宏入口
导言 Rust是一门现代的、安全的系统级编程语言,它提供了丰富的元编程特性,其中类函数宏(Function-Like Macros)是其中之一。 在本篇博客中,我们将深入探讨Rust中的类函数宏,包括类函数宏的定义、使用方法以及一些实际应用案例,以帮助读者充分了解类函数宏的魅力。 1. 类函数宏的基本概念 1.1 类函数宏的定义 在Rust中,类函数宏是一种特殊的宏,它允许开发者创建类似函数调用的宏,并在编译期间对代码进行生成和转换。 代码安全性:类函数宏生成的代码必须是合法的Rust代码,它们受到Rust编译器的类型检查和安全检查。这保证了宏生成的代码不会引入潜在的编译错误和安全漏洞。 2. 结论 本篇博客中,我们深入探讨了Rust中的类函数宏,包括其定义、使用方法以及应用案例。
今天尝试下使用Rust中的过程宏来实现类似功能。
课程主题:《通过实战理解 Rust 宏》 课程时间: 2021年8月15日 20:30-21:30 课程介绍: 如果想用 Rust 开发大型目,或者学习大型项目代码,特别是框架级别的项目,那么 Rust 的宏机制肯定是一个必须掌握的技能。 语言强大的一个特点就是可以创建和利用宏,不过创建宏看起来挺复杂,常常令刚接触 Rust 的开发者生畏惧。 在本次公开课中帮助你理解 Rust Macro 的基本原理,学习如何创自已的 Rust 宏,以及查看源码学习宏的实现。 课程大纲 什么是 Rust 宏 什么是宏运行原理 如何创建 Rust 宏过程 阅读 datafuse 项目源码, 学习项目中宏的实现
Rust中打印语句为什么使用宏?在Rust中,打印语句使用宏(例如println!和format!)的主要原因是为了在编译时进行字符串格式检查,并在不引入运行时开销的情况下提供更高的性能和安全性。 Rust宏允许在字符串中插入变量,而在编译时,编译器可以检查这些插值是否与实际的变量类型匹配。这有助于捕获潜在的格式化错误,防止运行时发生类型不匹配或其他问题。 在编译时,Rust会检查实际传递的参数是否与占位符的数量和类型匹配。2. 零成本抽象Rust中的宏提供了一种零成本的抽象。这意味着使用宏并不会引入运行时开销。在编译时,宏会被展开为实际的代码。 宏的简化定义。通过宏,可以将代码的抽象层次提高,同时不会影响性能。宏展开后,println!("Hello, world!") 和类似的宏使得代码更加灵活、可重用,并允许在编译时进行更多的优化。这是 Rust 中推崇的一种编程风格,有助于编写安全、高性能的代码。
Rust 宏定义,拯救运行时错误 如果你碰巧在 Rust 应用程序中使用 Lua ,你可以编写一个小宏,在 Lua 上强制执行它并运行 Lua 解释器以在编译时捕获相关错误。 作者以 Aerospike 分布式键值存储为,展开了如何通过 rust 宏中展开 lua 解析到 AST 上并校验 Aerospike 规则的方法。 C++ vs Rust :可变性和所有权 本文中,作者比较了 C++ 和 Rust 可变性,所有权等特性。 这篇文章可能对刚开始接触 Rust 的 C++ 开发人员特别有帮助。 侯盛鑫 坏姐姐 社区学习交流平台订阅: Rust.cc 论坛: 支持 rss 微信公众号:Rust 语言中文社区
在 Rust 中,宏是编写生成代码的代码(元编程)。但与 C 语言的简单文本替换不同,Rust 的宏操作的是抽象语法树(AST),这让它们既强大又安全。 Rust 宏的家族树scss 体验AI代码助手 代码解读复制代码Rust 宏├── 声明宏 (Declarative Macros)│ └── macro_rules! (sum 1, 2, 3, 4, 5)); // 15}1.4 实战案例:类型安全的单位转换rust 体验AI代码助手 代码解读复制代码macro_rules! [1, 2, 3, 4, 5];// ✅ 但要注意宏展开可能增加二进制大小// 如果宏在很多地方调用且生成大量代码,考虑改用函数常见误区误区 1:宏可以做任何事现实: 宏有明确的限制。 } };}误区 2:忽略宏的顺序依赖rust 体验AI代码助手 代码解读复制代码// ❌ 错误:宏还未定义fn main() { my_macro!();}macro_rules!
宏宏是MacOS系统,Terminal页面可以操作,自带的zshell挺好用的1.登陆服务器ssh 用户名@ip地址ssh bio05@***.**.***.**2.pwd命令pwd: print working /-rw-rw-r-- 1 bio05 bio05 0 Apr 14 22:45 doodle.txtdrwxrwxr-x 2 bio05 bio05 4096 Apr 14 22:45 huahua @ecm-cefa:~/tmp$ lltotal 16drwxrwxr-x 2 bio05 bio05 4096 Apr 14 23:04 . bio05 bio05 4096 Apr 14 22:32 biosoft/drwx------ 2 bio05 bio05 4096 Apr 14 16:11 .cache/drwx------ bio05 bio05 4096 Apr 14 22:32 project/drwxrwxr-x 2 bio05 bio05 4096 Apr 14 22:32 src/drwxrwxr-x 2 bio05
改进 Rust 宏中的自动完成功能 自动完成是 IDE 提供的一种功能,可以帮助开发者在编写代码时快速找到正确的关键字和参数。在 Rust 宏中,自动完成功能可能会出现不准确或不完整的情况。 文章作者介绍了以下几种方法来改进 Rust 宏中的自动完成功能, 这样可以使你的宏在使用的过程中体验更好. 原文链接 https://blog.emi0x7d1.dev/improving-autocompletion-in-your-rust-macros/ IoT 和 Rust: 在 ESP 上连接 wifi 原文链接 https://dev.to/apollolabsbin/iot-with-rust-on-esp-connecting-wifi-4be6 Rust和 C++ 的两种动态分派方式 Rust Rust 和 C++ 动态分派的优缺点 Rust 优点: trait object 是类型安全的,这意味着编译器可以确保您不会调用不兼容的类型上的方法。 trait object 的性能开销很小。
最后一期《程序君的 Rust 培训 (2)》还是去年 6 月出品的,我记得肝那期时,正赶上西雅图百年一遇的酷暑,晚上十点多还有 39 度的高温,以至于我的 mbp 那几天经常会被热到关机自保。 这个长周末,Tubi Holiday 加马丁路德金日,一下子整出来四天假期,于是我有了大段的时间开始构思在《Rust 第一课》中,读者们呼声很高的宏编程,打算搞个加餐。 于是,就有了这个「Rust 过程宏」系列的三期视频。 第一期,我不用 syn/quote 徒手写了个通过 JsonSchema 生成 Rust struct 的函数宏,从最底层的逻辑出发,让大家了解 Rust 的 TokenStream,以及如何把包含代码的字符串转换成 这个 Builder 宏的需求来自于 dtolnay 的 proc-macro-workshop 中的一个练习,Jon Gjengset 在他的 Procedural Macros in Rust 视频中