我想在宏生成的文档中使用宏变量:
macro_rules! impl_foo {
($name:ident) => {
/// Returns a new `$name`.
fn myfoo() -> $name {
}
};
}
但是,该变量不会被替换。我还尝试使用#[doc]
属性:
macro_rules! impl_foo {
($name:ident) => {
#[doc = concat!("Returns a new `", $name, "`.")]
fn myfoo() -> $name {
}
};
}
这个命令甚至无法解析:unexpected token: 'concat'
发布于 2017-04-12 02:40:52
这可以使用递归宏来完成:
macro_rules! impl_foo {
($name:ident, $sname:expr) => {
#[doc = "Returns a new `"]
#[doc = $sname]
#[doc = "`."]
pub fn myfoo() -> $name {
42
}
};
($name:tt) => {
impl_foo!($name, stringify!($name));
};
}
impl_foo!(u32);
fn main() {
println!("Hello, world!");
}
它呈现为:
发布于 2021-08-14 12:13:05
虽然对于简单的示例,the answer @mcarton gave确实可以很好地工作,但对于更复杂的示例,它会稍有不同。Rustdoc似乎在不同的doc
属性之间插入空格。标记处理器在大多数情况下会将它们去掉,但有时,它会将它们转换为空格。考虑这个例子:
macro_rules! impl_foo {
($name:ident, $sname:expr) => {
#[doc = "You can call this as `myfoo("]
#[doc = $sname]
#[doc = ")`."]
pub fn myfoo(_: $name) -> $name {
42
}
};
($name:tt) => {
impl_foo!($name, stringify!($name));
};
}
impl_foo!(i32);
fn main() {
println!("Hello, world!");
}
这应该会生成文档“您可以将其称为myfoo(i32)
。”,但实际上,它会生成“您可以将其称为myfoo( i32 )
”。(请注意额外的空格):
我不太确定我的解决方案是否适用于2017年的rustc,但在现代的rustc中,这可以通过将stringify!
与concat!
相结合来实现
macro_rules! impl_foo {
($name:tt) => {
#[doc = concat!("You can call this as `myfoo(", stringify!($name), ")`.")]
pub fn myfoo(_: $name) -> $name {
42
}
};
}
impl_foo!(i32);
fn main() {
println!("Hello, world!");
}
这将生成您想要的文档(因此,没有多余的空格):
https://stackoverflow.com/questions/43353077
复制相似问题