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

 更新时间:2024年03月31日 10:12:05   作者:微小冷  
本文主要介绍了Rust用宏实现参数可变的函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

声明式宏

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解决嵌套——Option类型的map和and_then方法的使用

    rust解决嵌套——Option类型的map和and_then方法的使用

    这篇文章主要介绍了rust解决嵌套——Option类型的map和and_then方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Rust中泛型的学习笔记

    Rust中泛型的学习笔记

    在Rust语言中,泛型是一种强大的工具,它允许我们编写可复用且灵活的代码,本文主要介绍了Rust中泛型的学习笔记,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 详解Rust中泛型的使用

    详解Rust中泛型的使用

    泛型是一种在编写代码时不指定具体类型,而在使用时再确定类型的编程技巧,本文将详细介绍?Rust?中泛型的相关概念和用法,希望对大家有所帮助
    2023-06-06
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust?的每个引用都有自己的生命周期。本文将通过示例和大家详细说说Rust的生命周期,需要的可以参考一下
    2022-11-11
  • Rust中引用和指针的区别详解

    Rust中引用和指针的区别详解

    在 Rust 中,指针和引用都可以用来指向内存中的某个值,它们之间的主要区别在于它们的安全性和生命周期保证,本文将通过一个简单的示例给大家介绍一下Rust中引用和指针的区别,需要的朋友可以参考下
    2023-08-08
  • Rust指南之泛型与特性详解

    Rust指南之泛型与特性详解

    泛型机制是编程语言用于表达类型抽象的机制,一般用于功能确定、数据类型待定的类,如链表、映射表等,这篇文章主要介绍了Rust指南泛型与特性,需要的朋友可以参考下
    2022-10-10
  • Rust生成随机数的项目实践

    Rust生成随机数的项目实践

    Rust标准库中并没有随机数生成器,常见的解决方案是使用rand包,本文主要介绍了Rust生成随机数的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust?中?Deref?Coercion讲解

    Rust?中?Deref?Coercion讲解

    Rust 的设计理念一向是显式比隐式好,也就是说所有的行为尽量在代码中表现出来,这篇文章主要介绍了Rust?中?Deref?Coercion?介绍,需要的朋友可以参考下
    2022-10-10
  • Rust?HashMap详解及单词统计示例用法详解

    Rust?HashMap详解及单词统计示例用法详解

    HashMap在Rust中是一个强大的工具,通过合理使用可以简化很多与键值对相关的问题,在实际开发中,我们可以充分利用其特性,提高代码的效率和可读性,本文将深入介绍HashMap的特性,以及通过一个单词统计的例子展示其用法,感兴趣的朋友一起看看吧
    2024-02-02
  • rust交叉编译问题及报错解析

    rust交叉编译问题及报错解析

    这篇文章主要为大家介绍了rust交叉编译问题及报错解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论

?


http://www.vxiaotou.com