我想检查一个特定的嵌套字段是否等于某个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
的引用。
1条答案
按热度按时间y1aodyip1#
您可以提取
Some
中的值,这将给予您一个String
类型的值,然后您可以将其与if
保护中的==
进行比较:输出:
Playground
正如@drewtato在下面的评论中指出的那样,这将
move
整个value
。如果您想再次重用value
,可以与Some(ref value)
匹配,比较仍然有效。