如何在Rust嵌套模式中匹配String类型值?
Rust嵌套String字段的匹配优化方案
我需要检查某个嵌套字段是否等于特定字符串,仅匹配时执行对应分支。尝试了以下代码,但因&str与String类型不匹配无法运行:
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") // 报错:&str != String } } => println!("Matched! baz: {}", baz), _ => panic!("No Match") }
用match guard可以实现,但每次都要创建新的String做判断:
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 }, } if value == Some("foobar".to_string()) => println!("Matched! baz: {}", baz), _ => panic!("No Match"), }
这是唯一的方案吗?有没有更好的实现方式?
注:已了解字符串字面量匹配String的基础方案,但我的场景是嵌套结构,无法直接通过引用String来匹配。
更优实现方式
1. 解构时绑定引用+match guard
在解构嵌套字段时,用ref关键字绑定String的引用,直接和&str字面量比较,避免额外内存分配:
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(ref s) if s == "foobar" } } => println!("Matched! baz: {}", baz), _ => panic!("No Match") }
2. 利用Deref特性的模式匹配(Rust 1.42+)
借助String实现的Deref<Target=str>特性,用@绑定引用并直接匹配字面量,代码更简洁:
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(ref s @ "foobar") } } => println!("Matched! baz: {}", baz), _ => panic!("No Match") }
3. 预定义静态目标字符串(高频匹配场景)
如果需要多次匹配同一字符串,提前创建静态字符串避免重复分配:
use lazy_static::lazy_static; use std::sync::Arc; lazy_static! { static ref TARGET: Arc<String> = Arc::new("foobar".to_string()); } 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 }, } if value.as_ref() == Some(&**TARGET) => println!("Matched! baz: {}", baz), _ => panic!("No Match"), }
内容的提问来源于stack exchange,提问作者user3690467
相关产品推荐
相关产品推荐

