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

时间:2018-05-08 07:23:05

标签: vector types rust

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

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)
}

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

1 个答案:

答案 0 :(得分:3)

一般来说,[T] is a contiguous sequence and &[T] is a slice

编译器允许&[String]而不是&Vec<String>的原因是Vec<T> dereferences to [T]。可以说前一种表示法(在函数参数中)更为通用;它也是the preferred one。有关自动解除引用规则的更多详细信息,请参阅this question