如何在Rust中匹配一个 &'static str?

3

我是一个Rust初学者,无法解决这个类型问题。我已经尝试用name替换&name,但出现了错误“模式&_未覆盖”。

fn get_project(name: &'static str) {
    match &name {
        "hi" => {},
    }
}

fn main() {
    let project = get_project("hi");
}

编译错误:

error[E0308]: mismatched types
 --> <anon>:3:9
  |
3 |         "hi" => {},
  |         ^^^^ expected &str, found str
  |
  = note: expected type `&&str`
  = note:    found type `&'static str`

https://dev59.com/wV8e5IYBdhLWcg3wwMv8 - Stargateur
我已经看到了,但是无法解决我的问题。 - maku
2个回答

6

字符串字面量 - 比如 "hi" - 其类型为 &'static str。所以如果你已经有了一个&str,就不需要添加&

fn get_project(name: &str) {
    match name {
        "hi" => {},
        _ => {}, // matches have to be exhaustive 
    }
}

我还添加了一个默认情况,因为在Rust中,匹配需要是全面的:它们需要涵盖所有可能的情况。
也许你注意到了,我还从参数列表中删除了'static。如果您想阅读一些关于生命周期的内容,请继续阅读。否则,请停止阅读,因为在这种情况下,这可能会令人困惑且不那么重要。
在此函数中,不需要将给定参数的生命周期限制为'static。也许您还想传递从String借用的字符串切片:
let user_input = read_user_input();  // type `String`
get_project(&input);

当您从参数中删除 'static 后,上面的代码才能正常工作。一旦删除,该函数等效于:

fn get_project<'a>(name: &'a str) { ... }

这意味着该函数适用于生命周期'a。该函数表示:给定任何生命周期'a,您可以为我提供一个具有该生命周期的字符串,我就能够做我的事情。这是正确的。如果该函数无法适用于任何生命周期,编译器会抱怨;-)

3
在你的示例中,name 不需要具有 static 生命周期。因为你只在函数内部使用 name,所以 name 不需要具有扩展的生命周期。请查看《Rust编程语言》的字符串章节。要将 &str&'static str 匹配,不需要使用 &,只需使用变量本身即可。
pub fn get_project(name: &str) {
    match name {
        "hi" => println!("I found hi!"),
        _ => println!("Nothing match"),
    }
}

fn main() {
    get_project("hi");
    get_project("42");
}

@LukasKalbertodt 谢谢,我是 Rust 的新手。你的回答非常清晰明了。我已经尽力修复了。 - Stargateur
@Stargateur,我已经看到你的修复了,我的评论不见了;-)欢迎来到Rust,希望你在这里玩得开心^_^ - Lukas Kalbertodt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接