如何匹配Rust中的&'静态str

时间:2016-12-22 03:56:21

标签: rust

我是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`

2 个答案:

答案 0 :(得分: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,你可以给我一个字符串表示生命周期,我能够做我的事情。这是真的。如果函数不能在任何生命周期内完成,编译器会抱怨; - )

答案 1 :(得分:3)

在您的示例中,name不需要static生命周期。由于您只在函数中使用name,因此name不需要延长使用寿命。查看 The Rust Programming Language strings chapter。要将&str与您不需要&'static str的{​​{1}}相匹配,只需变量本身即可。

&