匹配一个字符串

Matching a string

我有这个

fn main() {
    let args = os::args();
    let first_args = args[1].to_string();
    match first_args {
        "test" => println!("Good!"),
        _      => println!("No test ?!"),
    }
}

但是在编译过程中,我得到这个错误:

error: mismatched types: expected `collections::string::String`, found `&'static str` (expected struct collections::string::String, found &-ptr)
src/command_line_arguments.rs:7         "test" => println!("Good!"),
                                        ^~~~~~

有人可以帮助我更好地理解这一点吗?这样做的更好方法是什么?

Strings section of the Rust Book 所述,Rust 中有两种字符串。简短版本:有些字符串 拥有 其内容 (String),有些字符串不拥有 (&str).

first_argsString,但字符串文字是 &str(如错误所述)。为此,您需要将 first_args 变回借用的字符串,如下所示:

fn main() {
    let args = os::args();
    let first_args = args[1].to_string();
    match &*first_args {
        "test" => println!("Good!"),
        _      => println!("No test ?!"),
    }
}

澄清一下 &* 的作用:拥有容器(如 StringVec)可以 "decay" 借用对其内容的引用。 * 用于将容器 "dereference" 放入其内容中( *first_args 采用 String 并提供对底层 str),而 & 重新借用该值,将其变回常规引用。