我正在尝试将选项字符串与匹配语句相匹配
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
我找到了答案,但它看起来也不够优雅。但这只是不创建额外变量或函数的一种可能方法吗?
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>,使其与字符串文字匹配表达式兼容。