首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解dbg!锈蚀中的宏

理解dbg!锈蚀中的宏
EN

Stack Overflow用户
提问于 2021-01-28 22:36:16
回答 1查看 1.3K关注 0票数 0

我正在尝试编写一些我自己的调试宏,并在dbg!中查看用于锈迹生成的源代码

代码语言:javascript
复制
macro_rules! dbg {
    () => {
        $crate::eprintln!("[{}:{}]", $crate::file!(), $crate::line!());
    };
    ($val:expr $(,)?) => {
        // Use of `match` here is intentional because it affects the lifetimes
        // of temporaries - https://stackoverflow.com/a/48732525/1063961
        match $val {
            tmp => {
                $crate::eprintln!("[{}:{}] {} = {:#?}",
                    $crate::file!(), $crate::line!(), $crate::stringify!($val), &tmp);
                tmp
            }
        }
    };
    ($($val:expr),+ $(,)?) => {
        ($($crate::dbg!($val)),+,)
    };
}

有几件事让我对这段代码感到困惑:

  1. 在这段代码中,$操作符在做什么?
  2. 什么是平面语言等价于($val:expr $(,)?)?我不明白,是什么以及它为什么在那里。
  3. 为什么宏定义以() => {$crate::eprintln!("[{}:{}]", $crate::file!(), $crate::line!());};开头
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 23:10:00

在这段代码中,$ operator在做什么?

macro_rules!在普通锈蚀之上有不同的语法。$s用于表示元数据(如$ident)和重复(如$(...))。您可能应该对Rust宏是什么做一些初步研究:

什么是平面语言等价于($val:expr $(,)?)?我不明白,是什么以及它为什么在那里。

$val:expr定义了与单个表达式匹配的模式。$(,)?匹配可能存在0次或1次的,。有效地使它能够使dbg!允许可选的后缀逗号(以便模仿大部分锈蚀)。您将在另一个模式$($val:expr),+ $(,)?中看到这一点。

为什么宏定义以() => {$crate::eprintln!("[{}:{}]", $crate::file!(), $crate::line!());};开头?

此宏设计为使用任意数量的参数调用,包括零。() => { ... };模式允许dbg!()有效。调用不带参数的dbg!的效果是只记录文件和行号。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65946195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档