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))

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

查看所有标签

猜你喜欢:

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

Microsoft Windows程序设计

Microsoft Windows程序设计

佩措尔德 / 章立民 / 华中科技 / 2004-1 / 118.00元

Charles Petzold是全球最权威且知名的Windows程序设计专家,他将其最畅销Programming Microsoft Windows with C#一书加以改写,使之能完全适用于Visual Basic.NET的开发人员。这位畅销书的作家示范了如何使用Visual Basic.NET将Windows Forms的功能发挥到极致(Windows Forms是新一代的Windows程序......一起来看看 《Microsoft Windows程序设计》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具