首页 > 其他分享 >Rust基础学习-Rust宏

Rust基础学习-Rust宏

时间:2024-06-08 09:30:05浏览次数:17  
标签:macro 基础 学习 print 表达式 println message Rust

Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码,简化重复模式,使得代码更加简洁。比如我们一直在用的println!,vec!,panic!都是宏。

image1_0


创建宏

可以使用macro_rules!创建一个宏:

macro_rules! macro_name {
    (...) => {...}
}

这里的() => {}是宏规则条目,我们可以在单个宏中匹配很多规则。

下面的宏将实现打印一个Hello World!:

macro_rules! hello_world {
    () => {
        println!("hello world!");
    };
}

fn main() {
    hello_world!()
}

带参数的宏

宏也可以接受参数,这使我们能够根据不同的输入定制生成的代码。例如,这是一个定义函数以打印自定义消息的宏:

macro_rules! print_msg {
    ($message:expr) => {
        println!("{}", $message)
    };
}

fn main() {
    print_msg!("helllo Rust");
}

在这里,创建了一个名为 print_message 的宏,它接受一个参数 $message。宏的参数使用美元符号 $ 进行前缀,并用设计器进行类型注释。Rust 将尝试匹配在匹配规则中定义的模式。在上面的例子中,我们的规则是:

($message:expr) => {
    println!("{}", $message)
};

在分号后面的部分:被称为标识符,这些是我们可以选择匹配的类型。在示例中,我们使用表达式标识符(expr)。

在这个例子中 m e s s a g e message message被赋值为hello Rust,然后传递到println!({},$message);

注意:在宏规则体内,我们可以使用许多设计ators

  • stmt:一个语句
  • pat:一个模式
  • expr:一个表达式
  • ty:一个类型
  • ident:一个标识符

Rust中的重复

当我们需要生成重复的代码时,Rust 宏也非常有用。我们可以定义一个宏来接受参数,并根据这些参数重复生成的代码。

macro_rules!支持使用$(…)*语法进行重复。括号内的…可以是任何有效的Rust表达式或模式。

macro_rules! repeat_print {
    ($($x:expr),*) => {
        $(
        println!("{}",$x);
        )*
    };
}
fn main() {
    repeat_print!(1, 2, 3, 4, 5, 6);
}

在这里,宏 repeat_print 接受一个参数,($($x:expr),*),这是一个重复的模式。
该模式由零个或多个表达式组成,用逗号分隔,这些表达式由宏匹配。在末尾的星号( * )符号将反复匹配 $()中的模式。

Breakdown of macro match rule in Rust

  • 在大括号内的代码 println!({}, $x); ,根据宏定义的主体中 $(…)* 的包装,会重复零次或多次,每次对参数列表中的表达式执行一次。
  • 代码中的 $x 指的是匹配的表达式。 生成的代码的每次迭代都将打印不同的表达式。
  • 现在,当我们调用 repeat_print!(1, 2, 3); 时,宏将生成这段代码:
println!("{}", 1); // matches argument 1,
println!("{}", 2); // matches argument 2,
println!("{}", 3); // matches argument 3

因此,这个宏 repeat_print! 能够以简洁和便捷的方式打印多个表达式,而无需每次都编写println!宏。


标签:macro,基础,学习,print,表达式,println,message,Rust
From: https://blog.csdn.net/2302_76401343/article/details/139539461

相关文章

  • 【纯干货】深度学习各算法的优缺点和适用场景!建议收藏。(上篇)
    ..纯 干 货.目录前馈神经网络1、梯度下降(GradientDescent)2、随机梯度下降(StochasticGradientDescent,SGD)3、小批量梯度下降(Mini-batchGradientDescent)4、动量(Momentum)5、AdaGrad、RMSprop、Adam等自适应学习率算法卷积神经网络1、LeNet-52、AlexNet3、V......
  • 学习笔记——路由网络基础——汇总静态路由
    4、汇总静态路由(1)定义 静态路由汇总:多条静态路由都使用相同的送出接口或下一跳IP地址。(将多条路由汇总成一条路由表示) (2)目的1.减少路由条目数量,减小路由表,加快查表速度2.增加网络稳定性(3)路由黑洞以及路由环路的产生以及解决方案路由黑洞:r1有路由条目给......
  • 【因果推断】【Introduction to Causal Inference from a Machine Learning Perspecti
    第一章动机:为什么你可能关心1.1辛普森悖论考虑一个纯粹假设的未来,有一种被称为COVID-27的新疾病在人类中流行。在这个纯粹假设的未来,有两种治疗方法已经被开发出来:治疗A和治疗B。治疗B比治疗A更稀缺,因此目前接受治疗A和治疗B的比例大致为73%/27%。在一个只关心最大限度......
  • 自注意力机学习
    自注意力机制的核心概念1.Query,Key和ValueQuery(查询向量):可以看作是你当前在关注的输入项。假设你正在阅读一段文字,这就像你当前在读的句子。Key(键向量):表示其他所有输入项的标识或特征。这就像你在书中已经读过的所有句子的摘要或要点。Value(值向量):是与每个Key相......
  • c语言基础问题:1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少瓶汽水?
    老师布置的小组作业,好像是曾经的蓝桥杯题目,自己琢磨一下写出来了,写都写了还都加了注释,就想着不如发到这上面了,有遇到类似问题的可以看看,代码比较笨但是很好理解。#include<stdio.h>intmain()//1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少瓶汽水?{ intyuan=20;//本金......
  • 【机器学习】TensorFlow 202107090086
    【源代码】importtensorflowastfl2_reg=tf.keras.regularizers.l2(0.1)#设置模型model=tf.keras.models.Sequential([tf.keras.layers.Dense(30,activation='relu',kernel_initializer='he_normal',kernel_regula......
  • 算法学习笔记(23):杜教筛
    杜教筛参考来源:OI-Wiki,网上博客线性筛可以在线性时间求积性函数前缀和,而杜教筛可以用低于线性时间求解积性函数前缀和。我们考虑\(S(n)\)就是积性函数的前缀和,所以我们尝试构造关于\(\largeS(n)\)关于\(\largeS(\lfloor\frac{n}{i}\rfloor)\)的递推式。对于任意......
  • 知识图谱学习记录(一)
    知识图谱学习记录(一)1.什么是知识图谱?知识图谱是一种用于表示知识的图形化结构,它包含了实体(如人物、地点、事件等)以及这些实体之间的关系。它的目的是将信息组织成易于理解和处理的形式,以便计算机程序能够理解和利用这些信息。知识图谱通常由三部分组成:实体(Entities):代表现实世......
  • DVWA靶场学习(一)—— Brute Force
    BruteForce暴力破解其实就是利用不同的账户和密码进行多次尝试。因为用户在设置密码时可能会选用比较容易记忆的口令,因此,可以使用一些保存常用密码的字典或者结合用户的个人信息进行爆破。DVWA安全等级有Low,Medium,High和Impossible四种,随着安全等级的提高,网站的防护等级和攻击......
  • 基础设施建设——全局请求参数校验
    基础设施建设——全局请求参数校验在BeanValidation漫谈一文中已经对BeanValidation进行了详细的介绍,以及SpringValidator与JakartaBeanValidation规范的关系,本文讨论在微服务架构中,如何做全局的请求参数校验。1.基于SpringMVC的http接口如何校验在SpringFramework中......