记录在Rust中用宏创建的函数

Ser*_*gey 5 macros rust

我试着这样做

#![deny(missing_docs)]
Run Code Online (Sandbox Code Playgroud)

在Rust.我发现///当使用像这样的宏创建函数时,注释会被忽略:

/// docs
py_module_initializer!(libx, initlibx PyInit_libx |py, m| {
    Ok(())
});
Run Code Online (Sandbox Code Playgroud)

有:

error: missing documentation for a function
113 | py_module_initializer!(libx initlibx PyInit_libx |py, m| {
    | ^
Run Code Online (Sandbox Code Playgroud)

我以为宏只会添加一个函数定义///.这有什么不对?

Luk*_*odt 9

您的文档注释引用了宏调用,在您的情况下它是无用的.要记录生成的函数,您必须将doc注释写入宏定义更改宏以接受doc注释.我们来看看这个:

#![deny(missing_docs)]
//! crate docs

macro_rules! gen_fn {
    ($name:ident) => {
        /// generic doc comment... not very useful
        pub fn $name() {}
    }
}

gen_fn!(a);
gen_fn!(b);
Run Code Online (Sandbox Code Playgroud)

这可行,但它不是最佳解决方案,因为所有生成的函数的doc注释都是相同的.如果要记录每个生成的函数,必须更改宏:

macro_rules! gen_fn {
    ($(#[$attr:meta])* => $name:ident) => {
        $(#[$attr])*
        pub fn $name() {}
    }
}

gen_fn!{
    /// Doc comment for a
    => a
}
Run Code Online (Sandbox Code Playgroud)

这有效,因为doc注释在#[doc(...)]内部转换为属性.您可以在此处找到有关它的更多信息.