为什么 &[T] 参数也接受 &Vec<T>?

kre*_*reo 5 types vector rust

我正在研究 Rust 书,即minigrep 项目。在那里我遇到了以下片段:

fn main() {
    let args: Vec<String> = env::args().collect();

    let (query, filename) = parse_config(&args);

    // --snip--
}

fn parse_config(args: &[String]) -> (&str, &str) {
    let query = &args[1];
    let filename = &args[2];

    (query, filename)
}
Run Code Online (Sandbox Code Playgroud)

对我来说最令人困惑的是args: &[String]。如果我将其替换为args: &Vec<String>,它也可以工作。我的猜测是,这&[String]是一个更通用的类型注释,不仅匹配&Vec<String>,还匹配其他一些类型。那是对的吗?如果是这样, 还可以匹配哪些其他类型[T]

lje*_*drz 7

一般来说,[T]是一个连续的序列,&[T]是一个切片

&[String]编译器允许而不是的原因&Vec<String>Vec<T>取消引用[T]. 这就是所谓的Deref强制。可以说,前一种表示法(在函数参数中)更为通用;也是首选之一有关自动取消引用规则的更多详细信息可以在这个问题中找到。