如何在 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)
}
如果你需要转换一个变量,你需要使用像这样的普通函数:
fn convert_foo_to_bar(foo: Foo) -> Bar {
match foo {
Foo::A => Bar::A,
Foo::B => Bar::B,
// .. for all of your variants
}
}
原需求:我想实现一个将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)
}
如果你需要转换一个变量,你需要使用像这样的普通函数:
fn convert_foo_to_bar(foo: Foo) -> Bar {
match foo {
Foo::A => Bar::A,
Foo::B => Bar::B,
// .. for all of your variants
}
}