我想用它macro_rules
来创建一个特征的实现。类型应该作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我也有一个来自宏内部的泛型类型。结果应该看起来像
impl<T> Foo<T> for MyType { .. }
// Or with lifetime:
impl<'a, 'b, T> Foo<T> for LifetimeType<'a, 'b> { .. }
如何构建宏以及如何调用它?
我想用它macro_rules
来创建一个特征的实现。类型应该作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我也有一个来自宏内部的泛型类型。结果应该看起来像
impl<T> Foo<T> for MyType { .. }
// Or with lifetime:
impl<'a, 'b, T> Foo<T> for LifetimeType<'a, 'b> { .. }
如何构建宏以及如何调用它?
您可以使用说明lifetime
符来匹配宏参数中的生命周期:
trait Foo{}
macro_rules!impl_foo {
($($l:lifetime),*; $t:tt) => { impl<$($l),*> Foo for $t<$($l),*> {} };
($t:ty) => { impl Foo for $t {} };
}
并这样称呼它:
impl_foo!(A);
impl_foo!('a, 'b; B);
请注意,我能找到的唯一谈到lifetime
捕获说明符的地方是相关的 RFC。尽管它在 2016 年被合并,但它在
Rust 宏小书中尤其明显地缺失了……</p>