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

Creating a Custom Colored dbg! Macro In Rust

我想创建一个类似于标准 dbg! macro, but with the option to use colors via the 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/line 号码 [path_to_file:line_number] 以便打印?
  2. 如何访问变量的符号名称? (即打印 my_var 给定 my_var = 12
  1. 使用 file!, line!, and column! 宏。
  2. 使用 stringify! 宏。

如果你去看dbg! macro, you can click [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 - 
        match $val {
            tmp => {
                $crate::eprintln!("[{}:{}] {} = {:#?}",
                    $crate::file!(), $crate::line!(), $crate::stringify!($val), &tmp);
                tmp
            }
        }
    };
    ($($val:expr),+ $(,)?) => {
        ($($crate::dbg!($val)),+,)
    };
}

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

(我随便选了个颜色,举个简单的例子)

// 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);
}

输出如下: