Erstellen einer benutzerdefinierten farbigen Datenbank! Makro im Rost
Ich möchte ein benutzerdefiniertes Makro erstellen, das dem Standard- DBG ähnelt! Makro , aber mit der Option, Farben über die farbige Kiste zu verwenden. dbg! druckt normalerweise etwas mit dem Format von
[path_to_file:line_number] "symbol name" = "symbol value"
//[src/gallery/image_slot.rs:231] "my_integer_value_of_12" = "12"
- Wie greife ich auf die Pfad- / Zeilennummer zu,
[path_to_file:line_number]
damit ich sie drucken kann? - Wie greife ich auf den Symbolnamen einer Variablen zu? (dh Druck
my_var
gegebenmy_var = 12
)
Antworten
5 vallentin
- Verwenden Sie die file!, line!und column!Makros.
- Verwenden Sie das stringify!Makro.
Wenn Sie zu den Dokumenten des dbg!Makros gehen, können Sie auf [src] klicken , das die Implementierung von dbg!
Folgendes anzeigt :
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)),+,)
};
}
Auf diese Weise können wir leicht ein ähnliches colored_dbg!
Makro mit der von Ihnen vorgeschlagenen coloredKiste erstellen .
(Ich habe nur zufällige Farben ausgewählt, für ein einfaches Beispiel)
// 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)),+,)
};
}
Sie würden es genauso verwenden, wie Sie es verwenden könnten dbg!
:
fn main() {
let my_var = 12;
colored_dbg!(&my_var);
let v = vec!["foo", "bar", "baz"];
let v = colored_dbg!(v);
}
Welches gibt folgendes aus: