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

时间:2016-12-28 12:11:34

标签: macros rust

我试着做

#![deny(missing_docs)]
在Rust,

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

/// docs
py_module_initializer!(libx, initlibx PyInit_libx |py, m| {
    Ok(())
});

使用:

error: missing documentation for a function
113 | py_module_initializer!(libx initlibx PyInit_libx |py, m| {
    | ^

我认为宏只会在///之后添加一个函数定义。这有什么不对?

1 个答案:

答案 0 :(得分:8)

您的文档注释引用了宏调用,在您的情况下它是无用的。要记录生成的函数,您必须将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);

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

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

gen_fn!{
    /// Doc comment for a
    => a
}

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