Как я могу получить "Bar" из "Foo :: Bar" в макросе ржавчины? - PullRequest
1 голос
/ 01 августа 2020

Исходное требование: я хочу реализовать макрос, который преобразует Foo::* в Bar::*.

Псевдокод будет выглядеть так:

macro_rules! convert_foo_to_bar {
    ($v: ty, $p: path) => (<$v>::$p.name)
}

// convert_foo_to_bar!(Bar, Foo::A) -> Bar::A

Хотя $p.name относится к A.

1 Ответ

1 голос
/ 01 августа 2020

Вы можете сопоставить Foo::A, используя Foo::$variant:ident, чтобы получить A как $variant, например:

macro_rules! convert_foo_to_bar {
    ($v: ty, Foo::$variant:ident) => (<$v>::$variant)
}

Игровая площадка

Если вы необходимо преобразовать переменную, вам нужно будет использовать обычную функцию, например эту:

fn convert_foo_to_bar(foo: Foo) -> Bar {
  match foo {
    Foo::A => Bar::A,
    Foo::B => Bar::B,
    // .. for all of your variants
  }
}
...