녹 매크로의 "Foo :: Bar"에서 "Bar"를 얻으려면 어떻게해야합니까?

2020-08-01 rust macros dst rust-macros

원래 요구 : 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.nameA 나타냅니다.

Answers

Foo::$variant:ident 를 사용하여 Foo::A 를 일치시켜 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
  }
}

Related