Rust用宏实现参数可变的函数的实现示例

 更新时间:2024年03月31日 10:12:05   作者:微小冷  
本文主要介绍了Rust用宏实现参数可变的函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

声明式宏

Rust中宏的概念与C/C++中相类似,是编译期间执行的一系列指令。但和C语言相比,Rust中的宏,有着更加复杂的替换,下面是一个示例

macro_rules! sqr {
    ($x:expr) => {$x * $x}
}

fn main() {
    println!("{}", sqr!(1 + 1));
}
// 运行结果为4

其中,$x的类型是expr,即表达式。sqr的具体操作,就是把表达式$x替换为$x * $x

仅从上面的示例来看,宏似乎同函数没什么区别,或许优势仅体现在编译期做替换,从而在编译后可以减少一个函数指针的开销。

所以,接下来,不妨用宏实现一个函数无法实现的功能:输入多个参数。

参数可变的求和函数

下面用宏实现一个输入参数可变的函数sum,功能是求和。

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

fn main(){
    println!("{}", sum!(1,2,3,4));
}

编译运行的结果为10,接下来就细致地探讨一下这个宏的替换规则。

首先,输入是

( $( $x:expr ),* )

这里星号起到一个重复匹配的作用,表示左侧的表达式可以重复匹配多次。而左侧的表达式又被分成两部分,最内层的$紧跟着的x是一个表达式,这个表达式没有任何要求。而这个x与后面的逗号与前面的$符号则形成了外层的匹配模式。

结合我们的输入

sum!(1,2,3,4)

摘掉调用宏时用到的sum!(),其真正被替换的值便是1,2,3,4,而与宏定义中表达式相匹配的,则可理解为依次是

1 , 2 , 3 , 4 \begin{matrix} 1,\\2,\\3,\\4 \end{matrix} 1,2,3,4​

从而宏的替换内容,可以被拆解为

let mut n = 0;
n += 1;
n += 2;
n += 3;
n += 4;
return n

于是,求和的功能就通过宏的方式实现了。

到此这篇关于Rust用宏实现参数可变的函数的实现示例的文章就介绍到这了,更多相关Rust 参数可变函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust你不认识的所有权

    Rust你不认识的所有权

    所有权对大多数开发者而言是一个新颖的概念,它是 Rust 语言为高效使用内存而设计的语法机制。所有权概念是为了让 Rust 在编译阶段更有效地分析内存资源的有用性以实现内存管理而诞生的概念
    2023-01-01
  • Rust中的derive属性示例详解

    Rust中的derive属性示例详解

    derive属性的出现解决了手动实现一些特性时需要编写大量重复代码的问题,它可以让编译器自动生成这些特性的基本实现,从而减少了程序员需要编写的代码量,这篇文章主要介绍了Rust中的derive属性详解,需要的朋友可以参考下
    2023-04-04
  • C和Java没那么香了,Serverless时代Rust即将称王?

    C和Java没那么香了,Serverless时代Rust即将称王?

    Serverless Computing,即”无服务器计算”,其实这一概念在刚刚提出的时候并没有获得太多的关注,直到2014年AWS Lambda这一里程碑式的产品出现。Serverless算是正式走进了云计算的舞台
    2021-06-06
  • 关于使用rust调用c++静态库并编译nodejs包的问题

    关于使用rust调用c++静态库并编译nodejs包的问题

    这篇文章主要介绍了使用rust调用c++静态库并编译nodejs包的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 解析rust中的struct

    解析rust中的struct

    自定义的数据类型,为相关联的值命名,打包成有意义的组合,类似python的dict,但是赋值的时候可以不按顺序,本文给大家介绍下rust中的struct知识,感兴趣的朋友一起看看吧
    2022-10-10
  • 详解Rust 生命周期符号使用的方法和规律

    详解Rust 生命周期符号使用的方法和规律

    生命周期是 Rust 中处理引用和所有权的关键概念,通过正确使用生命周期符号和遵循相关规律,你可以编写出安全、高效的 Rust 代码,这篇文章主要介绍了Rust 生命周期符号使用的方法和规律,需要的朋友可以参考下
    2024-03-03
  • 详解Rust中三种循环(loop,while,for)的使用

    详解Rust中三种循环(loop,while,for)的使用

    我们常常需要重复执行同一段代码,针对这种场景,Rust 提供了多种循环(loop)工具。一个循环会执行循环体中的代码直到结尾,并紧接着回到开头继续执行。而 Rust 提供了 3 种循环:loop、while 和 for,下面逐一讲解
    2022-09-09
  • 详解thiserror库在Rust中的使用

    详解thiserror库在Rust中的使用

    在编程中,错误处理是一个至关重要的部分,在Rust中,我们经常使用Result和Option类型来进行错误处理,但有时,我们需要创建自定义的错误类型,这就是thiserror库发挥作用的地方,可以极大的简化代码,所以本文就给大家介绍一下如何使用thiserror
    2023-08-08
  • vscode搭建rust开发环境的图文教程

    vscode搭建rust开发环境的图文教程

    Rust 是一种系统编程语言,它专注于内存安全、并发和性能,本文主要介绍了vscode搭建rust开发环境的图文教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust中的内部可变性与RefCell<T>详解

    Rust中的内部可变性与RefCell<T>详解

    内部可变性允许在不可变引用中修改内部数据,通过RefCell在运行时检查借用规则,适用于Mock对象和多所有权的可变性场景,结合Rc和RefCell实现多所有者共享并修改数据,但仅适用于单线程
    2025-02-02

最新评论