Rust 的 dbg! 宏

栏目: 编程语言 · Rust · 发布时间: 6年前

内容简介:前几天在群里看到有人讨论 dbg! 宏已经在 Nightly 可以使用了,最近发布的 stable 版本 1.32.0 也可以使用了。 翻看了一下并玩了玩,这个简单的宏确实是调试好帮手,特别是适合我这样的喜欢打印调试的开发者。这个提议从 2017 年 10 月开始,从先看看这个调试宏是怎么使用的,目前使用这个宏需要切换到 Nightly 版本或者最新的稳定版,已经安装了 rustup 的话就很简单了:然后很简单就是把一个表达式当作参数传入:

前几天在群里看到有人讨论 dbg! 宏已经在 Nightly 可以使用了,最近发布的 stable 版本 1.32.0 也可以使用了。 翻看了一下并玩了玩,这个简单的宏确实是调试好帮手,特别是适合我这样的喜欢打印调试的开发者。这个提议从 2017 年 10 月开始,从 https://github.com/rust-lang/rfcs/pull/2173 可以看到,为了增加这个宏很多贡献者经过了无数次的讨论和回复。真是太佩服 Rust Team 的开发者,付出了这么多时间来增加这个看似很小又实用的功能。

使用

先看看这个调试宏是怎么使用的,目前使用这个宏需要切换到 Nightly 版本或者最新的稳定版,已经安装了 rustup 的话就很简单了:

rustup default nightly
rustup update

然后很简单就是把一个表达式当作参数传入:

fn factorial(n: u32) -> u32 {
 if dbg!(n <= 1) {
 dbg!(1)
 } else {
 dbg!(n * factorial(n - 1))
 }
}

fn main() {
 dbg!(factorial(5));
}

运行结果如下:

[src/main.rs:4] n <= 1 = false
[src/main.rs:4] n <= 1 = false
[src/main.rs:4] n <= 1 = false
[src/main.rs:4] n <= 1 = false
[src/main.rs:4] n <= 1 = true
[src/main.rs:5] 1 = 1
[src/main.rs:7] n * factorial(n - 1) = 2
[src/main.rs:7] n * factorial(n - 1) = 6
[src/main.rs:7] n * factorial(n - 1) = 24
[src/main.rs:7] n * factorial(n - 1) = 120
[src/main.rs:12] factorial(5) = 120

实现

原理当然也就是把表达式和位置打印出来,但是这里有个技巧,在宏里面使用 match,这是为了避免参数被调用多次,因为宏在编译之前会被展开。Rust 的宏比较复杂,也不可避免会有些 hacky,对于喜欢爱折腾的 程序员 还是有吸引力。再看看这个宏是怎么实现的,代码很少。:

macro_rules! dbg {
 ($val:expr) => {
 match $val {
 tmp => {
 eprintln!("[{}:{}] {} = {:#?}",
 file!(), line!(), stringify!($val), &tmp);
 tmp
 }
 }
 }
}

可以看到目前这个实现是只支持一个参数的,如果传入的参数类型没有实现 Copy Trait,可以传入引用。另外如果想同时打印多个参数,可以使用类似这样的做法:

dbg!((exp1, exp2))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微机原理与接口技术

微机原理与接口技术

李文英、李勤、刘星、宋蕴新 / 清华大学出版社 / 2001-9 / 26.00元

《高等院校计算机应用技术规划教材•应用型教材系列•微机原理与接口技术》是“高职高专计算机系列教材”之一。全书包括微机原理、汇编语言、接口技术三部分内容。微机原理部分讲述了80x86的内部结构及工作原理、半导体存储器及其系统、微型机总线结构等。汇编语言部分讲述了指令系统、编程技巧。接口技术部分讲述了中断系统、中断控制器、并行接口、串行接口、DMA控制器、定时器,以及A/D、D/A转换器等常用芯片的硬......一起来看看 《微机原理与接口技术》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码