Creazione di un dbg colorato personalizzato! Macro In Ruggine

Jan 20 2021

Vorrei creare una macro personalizzata simile al dbg standard ! macro , ma con la possibilità di utilizzare i colori tramite la cassa colorata . dbg! di solito stampa qualcosa con il formato

[path_to_file:line_number] "symbol name" = "symbol value"
//[src/gallery/image_slot.rs:231] "my_integer_value_of_12" = "12"
  1. Come si accede al percorso / numero di riga in [path_to_file:line_number]modo da poterlo stampare?
  2. Come si accede al nome del simbolo di una variabile? (cioè stampa my_vardata my_var = 12)

Risposte

5 vallentin Jan 20 2021 at 02:00
  1. Utilizzare i file!, line!e column!le macro.
  2. Usa la stringify!macro.

Se vai alla documentazione della dbg!macro, puoi fare clic su [src] , che mostra l'implementazione di dbg!, che è la seguente:

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)),+,)
    };
}

Usandolo, possiamo facilmente creare una colored_dbg!macro simile , con la coloredcassa come hai suggerito.

(Ho appena scelto colori casuali, per un semplice esempio)

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

Lo useresti proprio come potresti usare dbg!:

fn main() {
    let my_var = 12;
    colored_dbg!(&my_var);

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

Che produce quanto segue: