在Rust中创建自定义颜色的dbg!宏

5
我想创建一个类似于标准dbg! macro的自定义宏,但可以通过colored crate使用颜色选项。 dbg!通常以以下格式打印内容
[path_to_file:line_number] "symbol name" = "symbol value"
//[src/gallery/image_slot.rs:231] "my_integer_value_of_12" = "12"
  1. 我如何获取路径/行号 [path_to_file:line_number] 来打印它?
  2. 我如何访问变量的符号名称?(例如,给定 my_var = 12,打印 my_var
1个回答

7
  1. 使用file!line!column!宏。
  2. 使用stringify!宏。

如果您查看dbg!宏的文档,可以单击[src],显示dbg!的实现,如下所示:

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://dev59.com/71YM5IYBdhLWcg3whAaH#48732525
        match $val {
            tmp => {
                $crate::eprintln!("[{}:{}] {} = {:#?}",
                    $crate::file!(), $crate::line!(), $crate::stringify!($val), &tmp);
                tmp
            }
        }
    };
    ($($val:expr),+ $(,)?) => {
        ($($crate::dbg!($val)),+,)
    };
}

使用这个,我们可以很容易地创建一个类似的colored_dbg!宏,使用您建议的coloredcrate

(我只是随便挑了几个颜色作为简单示例)

// colored = "2.0"
use colored::Colorize;

macro_rules! colored_dbg {
    () => {
        eprintln!("{}", format!("[{}:{}]", file!(), line!()).green());
    };
    ($val:expr $(,)?) => {
        match $val {
            tmp => {
                eprintln!("{} {} = {}",
                    format!("[{}:{}]", file!(), line!()).green(),
                    stringify!($val).red(),
                    format!("{:#?}", &tmp).blue(),
                );
                tmp
            }
        }
    };
    ($($val:expr),+ $(,)?) => {
        ($(colored_dbg!($val)),+,)
    };
}

你可以像使用 dbg! 一样使用它:
fn main() {
    let my_var = 12;
    colored_dbg!(&my_var);

    let v = vec!["foo", "bar", "baz"];
    let v = colored_dbg!(v);
}

转换为中文:

执行后会输出以下内容:

screenshot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接