การสร้างฐานข้อมูลสีที่กำหนดเอง! มาโครในสนิม

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

ซึ่งให้ผลลัพธ์ดังต่อไปนี้: