rust 如何匹配嵌套模式中的字符串

yruzcnhs  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(112)

我想检查一个特定的嵌套字段是否等于某个String,如果是,则只运行arm。类似于以下内容:

struct Bar {
    baz: usize,
    value: Option<String>
}

struct Foo {
    bar: Bar
}

let value = Foo { bar: Bar { baz: 1, value: Some("foobar".to_string()) } };

match value {
    Foo {
        bar: Bar {
            baz,
            value: Some("foobar") // does not work since &str != String
        }
    } => println!("Matched! baz: {}", baz),
    _ => panic!("No Match")
}

添加匹配保护可以工作,但常量String s不是一个东西,所以我不能使用它来保护,我看到的唯一可能性是防止新的String,如下所示:

struct Bar {
    value: Option<String>
}

struct Foo {
    bar: Bar
}

let value = Foo { bar: Bar { value: Some("foobar".to_string()) } };

match value {
    Foo {
        bar: Bar { baz, value },
    } if value == Some("foobar".to_string()) => println!("Matched! baz: {}", baz),
    _ => panic!("No Match"),
}

这是我唯一的选择,还是有更好的办法?
注意:我已经看到了How to match a String against string literals?,但我的匹配是嵌套的,更复杂(上面只是一个例子),所以我不能只匹配String的引用。

y1aodyip

y1aodyip1#

您可以提取Some中的值,这将给予您一个String类型的值,然后您可以将其与if保护中的==进行比较:

match value {
        Foo {
            bar: Bar {
                baz,
                value: Some(value),
            },
        } if value == "foobar" => println!("Matched! baz: {}", baz),
        _ => panic!("No Match"),
    }

输出:

Matched! baz: 1

Playground
正如@drewtato在下面的评论中指出的那样,这将move整个value。如果您想再次重用value,可以与Some(ref value)匹配,比较仍然有效。

相关问题