首页 > 其他分享 >Rust中的macro_rules

Rust中的macro_rules

时间:2024-10-14 22:44:19浏览次数:1  
标签:rules macro fn expr println Rust first

前言

在 Rust 中,macro_rules! 是一种声明宏,允许在编译时生成代码。

一、打印文本

示例: macro_rules!:声明了一个宏,宏的名字是 hello。调用 hello!() 时,编译器在编译时会展开宏,生成 println!("Hello, world!");

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

fn main() {
    hello!();  // 调用宏
}

二、带参数的宏

示例: $num:expr:宏参数 $num 是一个表达式(expr 是 Rust 中的模式类型,用于匹配任意表达式)。

macro_rules! print_num {
    ($num:expr) => {
        println!("The number is: {}", $num);
    };
}

fn main() {
    print_num!(10);  // 输出:The number is: 10
}

三、带多个参数的宏

示例: $($x:expr),:$x 匹配表达式,$() 表示重复匹配模式, 表示可以匹配零个或多个这样的表达式。

macro_rules! sum {
    ($($x:expr),*) => {
        {
            let mut total = 0;
            $(
                total += $x;
            )*
            total
        }
    };
}

fn main() {
    let result = sum!(1, 2, 3, 4, 5);  // 结果为15
    println!("Sum is: {}", result);
}

四、分支宏

示例: 根据传入的标记(first 或 second),匹配到不同的模式,生成不同的代码。

macro_rules! choose {
    (first) => {
        println!("You chose the first option.");
    };
    (second) => {
        println!("You chose the second option.");
    };
}

fn main() {
    choose!(first);   // 输出:You chose the first option.
    choose!(second);  // 输出:You chose the second option.
}

五、递归宏

示例:宏可以递归地调用自身,直到匹配结束。

macro_rules! write_list {
    () => {};  // 空列表的情况
    ($first:expr $(, $rest:expr)*) => {
        println!("{}", $first);
        write_list!($($rest),*);  // 递归调用宏
    };
}

fn main() {
    write_list!("apple", "banana", "cherry");
    // 输出:
    // apple
    // banana
    // cherry
}

六、宏中的代码块

示例: ident 是用于匹配标识符的模式。宏将根据传入的标识符(如 foo 和 bar)生成不同的函数。

macro_rules! create_function {
    ($name:ident) => {
        fn $name() {
            println!("You called {}()", stringify!($name));
        }
    };
}

create_function!(foo);
create_function!(bar);

fn main() {
    foo();  // 输出:You called foo()
    bar();  // 输出:You called bar()
}

七、总结与反思

macro_rules! 是 Rust 的声明宏,使用模式匹配来生成代码。

标签:rules,macro,fn,expr,println,Rust,first
From: https://www.cnblogs.com/wxmai/p/18466360

相关文章

  • RustRover向Gitlab提价要求证书问题
    源码存储库是Gitlab,并没有使用证书方式进行身份验证,只是用账号和密码进行身份认证,但是,RustRover进行源码操作时候提示要求证书,如下图:解决方法:在插件里面搜索Gitlab,禁用,随后操作源码的时候,输入正确的账号和密码就可以了 参考:https://blog.csdn.net/qq_39306234/article/det......
  • Rust实现单例模式
    前言rust是基于C++实现的,所以对于rust来讲,更适合的是面向过程的设计。不过,仍然可以基于rust采用一些面向对象的设计思想,本文主要讲述如何通过rust语法实现单例模式。一、什么是单例模式?单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。它常用于需要控......
  • 使用JNA在java中调用rust函数
    JNA是sun公司对JNI能力的封装,更多信息请自行问AI。咱们直接上代码。调用系统本地库先引入jar包:<!--https://mvnrepository.com/artifact/net.java.dev.jna/jna--><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId>......
  • Rust 变量和基础类型
    Rust变量和基础数据类型2024-03-13类型,元组,数组,切片,动态数组,生命周期,动态大小,静态大小Rust通过let关键字声明变量,变量默认是不可变(只读)的.letfoo=5;//创建了一个不可变的变量foo,并绑定了5foo=10;//不能对foo重新绑定//使用mut关键字创......
  • Rust 与生成式 AI:从语言选择到开发工具的演进
    在现代软件开发领域,Rust语言正在逐步崭露头角,尤其是在高性能和可靠性要求较高的应用场景。与此同时,生成式AI的崛起正在重新塑造开发者的工作方式,从代码生成到智能调试,生成式AI的应用正成为提升开发效率和质量的重要工具。在本文中,我们将详细探讨Rust语言的现状与趋势,并分析......
  • Rust 中的 HashMap 实战指南:理解与优化技巧
    Rust中的HashMap实战指南:理解与优化技巧在Rust编程中,HashMap是一个强大的键值对数据结构,广泛应用于数据统计、信息存储等场景。在本文中,我们将通过三个实际的代码示例,详细讲解HashMap的基本用法以及如何在真实项目中充分利用它。此外,我们还将探讨Rust的所有权系统对Ha......
  • 实战逆向RUST语言程序
    实战为主,近日2024年羊城杯出了一道Rust编写的题目,这里将会以此题目为例,演示Rust逆向该如何去做。题目名称:sedRust_happyVm题目内容:unhappyrust,happyvm关于Rust逆向,其实就是看汇编,考验选手的基础逆向能力。在汇编代码面前,任何干扰都会成为摆设。1、初步分析64为程序,使用ID......
  • 逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header
    搜索示例搜索123,网页地址为:https://www.virustotal.com/gui/search/123/comments请求接口GET/ui/search?limit=20&relationships%5Bcomment%5D=author%2Citem&query=123HTTP/1.1Accept-Encoding:gzip,deflate,br,zstdAccept-Ianguage:en-US,en;q=0.9,es;q=0.8Accep......
  • 文盘rust--使用 Rust 构建RAG
    作者:京东科技贾世闻RAG(Retrieval-AugmentedGeneration)技术在AI生态系统中扮演着至关重要的角色,特别是在提升大型语言模型(LLMs)的准确性和应用范围方面。RAG通过结合检索技术与LLM提示,从各种数据源检索相关信息,并将其与用户的问题结合,生成准确且丰富的回答。这一机制特别适用于需......
  • RUST的引用和借用
        上一篇博客说到,移动是转交所有权,而克隆(Copy和Clone)是获得一个和旧值相同的新值的所有权)。    那么如果我们想不转交所有权又对变量的值进行读取和修改(比如方法的传参问题,会改变所有权,即移动;或者读取和修改的不是原变量的值,即克隆),应该怎么做?    RUST提供了......