Как я могу предоставить необязательные шаблоны в качестве аргументов macro_rules? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу использовать macro_rules для создания реализации для черты. Типы должны быть заданы как аргументы макросаОднако некоторые из этих типов могут содержать времена жизни, поэтому они мне нужны. У меня также есть универсальный тип внутри макроса. Результат должен выглядеть следующим образом:

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

Как структурировать макрос и как его назвать?

1 Ответ

1 голос
/ 16 октября 2019

Вы можете использовать спецификатор 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 . В частности, она явно отсутствует в небольшой книге макросов Rust , хотя она была объединена в 2016 году ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...