如何提供可选的泛型作为macro_rules参数?

时间:2019-10-15 18:14:12

标签: rust macros rust-macros

我想使用macro_rules为特征创建一个实现。类型应作为宏参数给出。但是,其中一些类型可能包含生存期,因此我需要它们。我在宏内部也有一个通用类型。结果应该像

impl<T> Foo<T> for MyType { .. }
// Or with lifetime:
impl<'a, 'b, T> Foo<T> for LifetimeType<'a, 'b> { .. }

我如何构造宏以及如何调用它?

1 个答案:

答案 0 :(得分:1)

您可以使用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);

Playground

请注意,我能找到的谈论捕获的lifetime指定者的唯一地方是the associated RFC。尽管The little book of Rust macros于2016年被合并,但它尤其明显地丢失了。