如何在不破坏 Rust 的情况下将枚举与参数匹配?

问题描述

我有带有值的变体的枚举:

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
}