字符串与 Rust 中的选项匹配 Some

Mad*_*677 4 rust

问题描述

我正在尝试将选项字符串与匹配语句相匹配

let option_string = Some(String::from("Bob"));
    
match option_string {
  Some("Mike") => false,
  Some("Bob") => true,
  _ => false,
}
Run Code Online (Sandbox Code Playgroud)

而且,显然,出现了错误expected struct 'String, found '&str'

我尝试将其更改为字符串转换

Some("Mike".to_string()) => false

// Or
Some(String::from("Mike")) => false
Run Code Online (Sandbox Code Playgroud)

但面临着不同的错误:'fn' calls are not allowed in patterns


唯一的工作方法是Mike在之前放入变量中Some

let mike = String::from("Mike");

// and in match
Some(mike) => true,
Run Code Online (Sandbox Code Playgroud)

问题

在有值的情况下,有一种更优雅的方法来匹配String但不是字符串文字吗?matchOption

我找到了答案,但它看起来也不够优雅。但这只是不创建额外变量或函数的一种可能方法吗?

Fin*_*nis 6

let mike = String::from("Mike");

// and in match
Some(mike) => true,
Run Code Online (Sandbox Code Playgroud)

恐怕这实际上是一种误解。表达式的左侧不允许使用变量match。左侧有一个名称实际上会创建一个包含匹配内容的新变量。因此子句mike中的变量match匹配所有内容,然后携带匹配的String; 它与外部变量不是同一变量mike

注意这个代码示例:

fn main() {
    let option_string = Some(String::from("Bob"));

    // Note how this line gets the compiler warning "unused variable".
    // You could leave this line out completely and it would still
    // compile.
    let mike = String::from("Mike");

    let result = match option_string {
        Some(mike) => {
            println!("Matched 'Mike': {}", mike);
            true
        }
        _ => false,
    };

    println!("{:?}", result);
}
Run Code Online (Sandbox Code Playgroud)
Matched 'Mike': Bob
true
Run Code Online (Sandbox Code Playgroud)

一般来说,您只能匹配编译时常量。如果你想比较两个变量,你必须使用if


解决方案

也就是说,您的第一个示例很容易修复:

Matched 'Mike': Bob
true
Run Code Online (Sandbox Code Playgroud)
true
Run Code Online (Sandbox Code Playgroud)

请注意.as_deref(),它借用Option<&str>Option<String>,使其与字符串文字匹配表达式兼容。