如何在函数参数中使用捕获的生命周期令牌



代码如下:

struct A<'a, 'b> {
s1: &'a str,
s2: &'b str,
}
struct B<'a> {
s3: &'a str,
}
macro_rules! gen_fn {
( $name:ident, $param:ty, < $($gen:tt),+ > ) => {
fn $name< $($gen),+ >(param: $param< $($gen),+ >) {
todo!()
}
}
}
fn main() {
gen_fn!( op_a, A, <'a, 'b>);
gen_fn!( op_b, B, <'a> );
}

然而,这段代码不能编译,因为Rust认为$param是一个参数,而$gen是另一个参数,所以它期望令牌,)

当我尝试展开宏时,生成的代码如我所愿:

fn op_a<'a, 'b>(param: A<'a, 'b>) {
$crate::panicking::panic("not yet implemented")
}
fn op_b<'a>(param: B<'a>) {
$crate::panicking::panic("not yet implemented")
}

是我做错了还是它只是不支持

您可以使用ident代替ty,但前提是您不使用路径(a::b):

macro_rules! gen_fn {
( $name:ident, $param:ident, < $($gen:tt),+ > ) => {
fn $name< $($gen),+ >(param: $param< $($gen),+ >) {
todo!()
}
}
}

如果你使用路径,你可以使用重复的ident:

macro_rules! gen_fn {
( $name:ident, $($param:ident)::+, < $($gen:tt),+ > ) => {
fn $name< $($gen),+ >(param: $($param)::+< $($gen),+ >) {
todo!()
}
}
}

最新更新