{ println-6ren">
gpt4 book ai didi

rust - 我怎样才能对 Option 进行模式匹配?

转载 作者:行者123 更新时间:2023-11-29 07:41:48 30 4
gpt4 key购买 nike

我可以直接匹配 Rust 中的 String:

let a = "hello".to_string();

match &a[..] {
"hello" => {
println!("Matches hello");
}
_ => panic!(),
}

如果我有一个选项类型,它会失败:

match Some(a) {
Some("hello") => {
println!("Matches some hello");
}
_ => panic!(),
}

因为类型不匹配:

error[E0308]: mismatched types
--> src/main.rs:5:14
|
5 | Some("hello") => {
| ^^^^^^^ expected struct `std::string::String`, found reference
|
= note: expected type `std::string::String`
found type `&'static str`

我不能使用 [..] 技巧,因为我们有一个 Option。最好的那个到目前为止我想出的是:

match Some(a) {
Some(b) => match (&b[..]) {
"hello" => {
println!("Matches some, some hello");
}
_ => panic!(),
},
None => panic!(),
}

它可以工作,但因为冗长而糟糕。

在这种情况下,我的代码只是一个例子。我不控制 StringSome(String) 的创建——因此我无法像我在示例中所做的那样在现实中更改此类型。

还有其他选择吗?

最佳答案

这是 Rust 模式的已知限制。

方法调用(包括运算符的内部方法,如 == )自动调用 .deref()根据需要,所以 String自动变成 &str用于与文字进行比较。

另一方面,这些模式在比较中非常直白,并且发现 String&str是不同的。

有两种解决方法:

  1. 更改 Option<String>Option<&str>在匹配之前:Some(a).as_deref() . as_deref()as_ref() 的组合这使得 Option<&String> (防止移动)和 deref()/as_str()然后明确地将其引用为 &str .

  2. 使用比赛守卫:match Some(a) { Some(ref s) if s == "hello" => … } . Some(ref s)匹配任何 String , 并将其捕获为 s: &String ,然后您可以在 if 中进行比较guard 执行通常的灵活强制以使其工作。

另见:

关于rust - 我怎样才能对 Option<String> 进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034119/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com