问题描述
我有带有值的变体的枚举:
enum Foobar<T,G> {
Foo,Bar(T),Baz(G),}
fn foobar<T,G,F1,F2>(value: Foobar<T,G>,f1: F1,f2: F2) -> bool
where
F1: Fn(T) -> bool,F2: Fn(G),{
let res = match value {
Foobar::Foo => true,Foobar::Bar(v) => f1(v),Foobar::Baz => false,};
if let Foobar::Baz(v2) = value {
f2(v2);
}
res
}
它不会编译,因为 expected unit struct,unit variant or constant,found tuple variant Foobar::Baz
我不想将其更改为 Foobar::Baz(_)
,因为它会在 G
上强制复制特征,而我不想要它。
我的例子有点人为,但假设我需要单独调用 f2
。
有没有办法在不破坏枚举的情况下匹配枚举变体?
解决方法
你不能。
但无论如何也无济于事。问题是在 value
之后 match
不可用,因为您(可能)将数据从它移到了 f1
。
您可以通过稍微重新组织代码来修复它,这样您就可以只在 Baz
中的值未被移动时查看 Bar
:
fn foobar<T,G,F1,F2>(value: Foobar<T,G>,f1: F1,f2: F2) -> bool
where
F1: Fn(T) -> bool,F2: Fn(G),{
let res = match value {
Foobar::Foo => true,Foobar::Bar(v) => f1(v),Foobar::Baz(v2) => {
f2(v2);
false
},};
res
}