Criando um dbg colorido personalizado! Macro em ferrugem
Jan 20 2021
Gostaria de criar uma macro customizada semelhante ao dbg padrão ! macro , mas com a opção de usar cores através da caixa colorida . dbg! geralmente imprime algo com o formato de
[path_to_file:line_number] "symbol name" = "symbol value"
//[src/gallery/image_slot.rs:231] "my_integer_value_of_12" = "12"
- Como faço para acessar o caminho / número da linha
[path_to_file:line_number]
para poder imprimi-lo? - Como faço para acessar o nome do símbolo de uma variável? (ou seja, impressão
my_var
fornecidamy_var = 12
)
Respostas
5 vallentin Jan 20 2021 at 02:00
- Use as file!, line!e column!macros.
- Use a stringify!macro.
Se você for aos documentos da dbg!macro, poderá clicar em [src] , que mostra a implementação de dbg!
, que é a seguinte:
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)),+,)
};
}
Usando isso, podemos criar facilmente uma colored_dbg!
macro semelhante , com a coloredcaixa como você sugeriu.
(Acabei de escolher cores aleatórias, para um exemplo simples)
// 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)),+,)
};
}
Você o usaria da mesma forma que seria capaz de usar dbg!
:
fn main() {
let my_var = 12;
colored_dbg!(&my_var);
let v = vec!["foo", "bar", "baz"];
let v = colored_dbg!(v);
}
O que resulta no seguinte:

O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?