Rust 的 dbg! 宏

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

内容简介:前几天在群里看到有人讨论 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))

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

查看所有标签

猜你喜欢:

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

Web API的设计与开发

Web API的设计与开发

[日] 水野贵明 / 盛荣 / 人民邮电出版社 / 2017-6 / 52.00元

本书结合丰富的实例,详细讲解了Web API的设计、开发与运维相关的知识。第1章介绍Web API的概要;第2章详述端点的设计与请求的形式;第3章介绍响应数据的设计;第4章介绍如何充分利用HTTP协议规范;第5章介绍如何开发方便更改设计的Web API;第6章介绍如何开发牢固的Web API。 本书不仅适合在工作中需要设计、开发或修改Web API的技术人员阅读,对想了解技术细节的产品经理、运维人......一起来看看 《Web API的设计与开发》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具