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-12-12
  • 一文带你了解Rust是如何处理错误的

    一文带你了解Rust是如何处理错误的

    程序在运行的过程中,总是会不可避免地产生错误,而如何优雅地解决错误,也是语言的设计哲学之一。本文就来和大家来了Rust是如何处理错误的,感兴趣的可以了解一下
    2022-11-11
  • 在Rust中编写自定义Error的详细代码

    在Rust中编写自定义Error的详细代码

    Result<T, E> 类型可以方便地用于错误传导,Result<T, E>是模板类型,实例化后可以是各种类型,但 Rust 要求传导的 Result 中的 E 是相同类型的,所以我们需要编写自己的 Error 类型,本文给大家介绍了在Rust中编写自定义Error的详细代码,需要的朋友可以参考下
    2024-01-01
  • Rust中的引用与借用举例详解

    Rust中的引用与借用举例详解

    这篇文章主要给大家介绍了关于Rust中引用与借用的相关资料,rust中借用和引用的附带功效都一样,就是都有生命周期,文中通过代码介绍的非常详细,对大家学习或者使用Rust具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • 详解Rust中的变量与常量

    详解Rust中的变量与常量

    大多数尝试过 Rust 的人都希望继续使用它。但是如果你没有使用过它,你可能会想——什么是 Rust,如何理解Rust中的变量与常量,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • rust的vector和hashmap详解

    rust的vector和hashmap详解

    这篇文章主要介绍了rust的vector和hashmap,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Rust如何使用Sauron实现Web界面交互

    Rust如何使用Sauron实现Web界面交互

    Sauron 是一个多功能的 Web 框架和库,用于构建客户端和/或服务器端 Web 应用程序,重点关注人体工程学、简单性和优雅性,这篇文章主要介绍了Rust使用Sauron实现Web界面交互,需要的朋友可以参考下
    2024-03-03
  • Rust中non_exhaustive的enum使用确保程序健壮性

    Rust中non_exhaustive的enum使用确保程序健壮性

    这篇文章主要为大家介绍了Rust中non_exhaustive的enum使用确保程序健壮性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Rust你不认识的所有权

    Rust你不认识的所有权

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

    使用systemd部署r-nacos的操作方法

    r-nacos是一个用rust实现的nacos服务,我们用它平替java nacos以降低服务占用内存,提升服务的稳定性,这篇文章主要介绍了使用systemd部署r-nacos,需要的朋友可以参考下
    2024-03-03

最新评论