首页 > 解决方案 > 如何提供可选泛型作为 macro_rules 参数?

问题描述

我想用它macro_rules来创建一个特征的实现。类型应该作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我也有一个来自宏内部的泛型类型。结果应该看起来像

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

如何构建宏以及如何调用它?

标签: rustmacrosrust-macros

解决方案


您可以使用说明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>


推荐阅读