如何在 Rust 宏中从 "Foo::Bar" 获取 "Bar"?

How can I get "Bar" from "Foo::Bar" in rust macro?

原需求:我想实现一个将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

您可以使用 Foo::$variant:ident 匹配 Foo::A 以获得 A 作为 $variant,如下所示:

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

Playground

如果你需要转换一个变量,你需要使用像这样的普通函数:

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