"B foo", C(ref a) => "C foo", -6ren">
gpt4 book ai didi

rust - 如何为相似的匹配武器编写宏?

转载 作者:行者123 更新时间:2023-11-29 08:23:46 24 4
gpt4 key购买 nike

我有一些重复的代码

match *x {
A(ref a) => "special",
B(ref a) => "B foo",
C(ref a) => "C foo",
D(ref a) => "D foo",
// ...
}

我想要一个像这样的宏

macro_rules! generic_fmt {
($T:ident) => {
$T(ref a) => {"$T foo"},
}
}

这样我就可以简化我的匹配

match *x {
A(ref a) => "special",
generic_fmt!(B),
generic_fmt!(C),
generic_fmt!(D),
// ...
}

最好的方法是什么?我正在使用 rustc 1.19.0-nightly。

最佳答案

你不能完全那样做。宏不能扩展为 match ARM (<Variant> => <Expression>)。

你能得到的最接近的可能是这样的:

enum Foo {
A(u32),
B(u32),
C(u32),
D(u32),
}

macro_rules! gen1 {
($Variant:ident) => {
Foo::$Variant(ref a)
}
}

macro_rules! gen2 {
($Variant:ident) => {
concat!(stringify!($Variant), " foo")
}
}

fn print(x: Foo) {
println!("{}", match x {
Foo::A(ref a) => "special",
gen1!(B) => gen2!(B),
gen1!(C) => gen2!(C),
gen1!(D) => gen2!(D),
});
}

fn main() {
print(Foo::A(42));
print(Foo::B(42));
print(Foo::C(42));
print(Foo::D(42));
}

Playground link.

关于rust - 如何为相似的匹配武器编写宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com