Предотвратить разрыв строки в тесте do c - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь написать тест do c для функции-члена struct, созданной макросом. По-видимому, использовать захват можно только в отдельном атрибуте do c. Однако это приводит к разрыву строки в тесте do c, так что захват заполняет всю строку в отображаемом результате. Это способ предотвратить разрывы строк или использовать захват непосредственно без использования процедурных макросов?

#[macro_export]
macro_rules! gen_functions {
    ($name:tt) => {
        /// # Usage
        /// 
        /// ```
        /// let h = 
        #[doc = $name]
        ///  {};
        /// h.test_a();
        /// ```
        pub fn test_a(&self) {
            println!("test a")
        }
    };
}

pub struct CustomStruct {}
impl CustomStruct {
    gen_functions!("CustomStruct");
}

fn main() {
    let h = CustomStruct {};
    h.test_a();
}

И полученный результат c тест. Он компилируется, но его трудно прочитать (по сравнению с версией в основной функции):

let h = 
CustomStruct
{};
h.test_a();

1 Ответ

2 голосов
/ 29 марта 2020

Кто-то показал мне хорошее решение для этого внутреннего потока , в котором используется макрос. Я изменил макрос, чтобы сделать его более приятным для использования.

Использование:

macro_rules! gen_functions {
    ($name:tt) => {
        doc! {
            /// # Usage
            ///
            /// ```
            [concat!(" let h = ", $name, " {};")]
            /// h.test_a();
            /// ```
            @ pub fn test_a(&self) {
                println!("test a")
            }
        }
    };
}

А это макрос:

macro_rules! doc {
    {
        $(#[$m:meta])*
        $(
            [$doc:expr]
            $(#[$n:meta])*
        )*
        @ $thing:item
    } => {
        $(#[$m])*
        $(
            #[doc = $doc]
            $(#[$n])*
        )*
        $thing
    }
}

Макрос преобразует строки в [ квадратные скобки ] в #[doc = _] атрибуты. Что делает его особенным, так это то, что он может содержать concat! и stringify! макро-вызовы. Их также можно комбинировать, например

doc! {
    /// # Usage
    ///
    /// ```
    [concat!(" let ", stringify!(h), " = ", stringify!(CustomStruct), " {};")]
    /// h.test_a();
    /// ```
    @ pub fn test_a(&self) {
        println!("test a")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...