커스텀 컬러 dbg 만들기! 녹의 매크로

Jan 20 2021

표준 dbg 와 유사한 사용자 지정 매크로를 만들고 싶습니다 ! 매크로 이지만 색상 상자 를 통해 색상을 사용하는 옵션이 있습니다 . 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주어진 인쇄 my_var = 12)

답변

5 vallentin Jan 20 2021 at 02:00
  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://stackoverflow.com/a/48732525/1063961 match $val {
            tmp => {
                $crate::eprintln!("[{}:{}] {} = {:#?}", $crate::file!(), $crate::line!(), $crate::stringify!($val), &tmp); tmp } } }; ($($val:expr),+ $(,)?) => {
        ($($crate::dbg!($val)),+,)
    };
}

이를 사용하여 제안한 상자 로 유사한 colored_dbg!매크로를 쉽게 만들 수 있습니다 .colored

(간단한 예를 들어 무작위 색상을 선택했습니다)

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

다음을 출력합니다.