Монтажер: Чжан Ханьдун
Примечание. Эта статья основана на исходном тексте, а также представляет другой контент.
Знакомство с новыми функциями макросов свойств
отRust 1.54Первоначально макросы свойств добавляли поддержку функциональных макросов.
Функционально-подобные макросы могут быть основаны наmacro_rules!
Макрос объявления также может быть чем-то вродеmacro!(...)
Процедурные макросы, которые называются именно так. Это неплохо для комментариев к документации. Если README вашего проекта является хорошим комментарием к документации, вы можете использоватьinclude_str!
непосредственно включать его содержание. Ранее различные обходные пути позволяли использовать аналогичную функциональность, но от1.54
Начнем с того, что он более эргономичен.
#![doc = include_str!("README.md")]
Если вы видели некоторые проекты с открытым исходным кодом Rust, вам следуетlib.rs
Вы видели кучу комментариев к документации? Эти комментарии настолько длинные, что реальный код оказывается внизу. С помощью этой функции такие проблемы могут быть решены.
macro_rules! make_function {
($name:ident, $value:expr) => {
// 这里使用 concat! 和 stringify! 构建文档注释
#[doc = concat!("The `", stringify!($name), "` example.")]
///
/// # Example
///
/// ```
#[doc = concat!(
"assert_eq!(", module_path!(), "::", stringify!($name), "(), ",
stringify!($value), ");")
]
/// ```
pub fn $name() -> i32 {
$value
}
};
}
make_function! {func_name, 123}
Также можно создавать комментарии к документации, встраивая вызовы макросов в свойства, подобные этому. Вы можете сравнить расширенный код:
///The `func_name` example.
///
/// # Example
///
/// ```
///assert_eq!(doc_attr::func_name(), 123);
/// ```
pub fn func_name() -> i32 {
123
}
В этом случае документ также можно использовать повторно. Конечно, вы также можете расширить другие варианты использования.
Другое использование
существуетЭта статья друга из иностранного сообществаВ , он перечислил некоторые приложения.
Расширьте возможности тестирования с помощью тестирования документов
Тесты документации Rust довольно гибкие, если вы пишете какую-то функцию или макрос и хотите убедиться, что он не скомпилируется при вводе определенного значения. Использование модульных тестов громоздко, но использование тестов документации очень удобно.
/// ```compile_fail
#[doc = include_str!("compile_fail.rs")]
/// ```
mod doc_test {}
Вы можете поставить соответствующие тесты вcomplile_fail.rs
, а затем включите его с помощью комментария документа, чтобы тесты были доступны, когда Cargo их выполняет. И в целом повышенная читаемость и ремонтопригодность кода Rust. Точно так же вы также можете проверить панику и т. Д.
Мы также не хотим, чтобы такие комментарии появлялись в документации конечного пользователя или в скомпилированном файле, поэтому нам нужно использоватьcfg(doctest)
чтобы скрыть это:
#[cfg(doctest)]
/// ```compile_fail
#[doc = include_str!("compile_fail.rs")]
/// ```
mod doc_test {}