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

5

我正在学习 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)
}

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

1个回答

7

1
[T] 不是一个数组,因为数组是具有静态已知大小的 [T; N]slice documentation[T] 称为连续序列。我不确定这是否是官方术语。 - MB-F
相比之下,参考文献 表示 [T] 是一个 切片&[T] 是一个 共享切片 ,通常被称为 切片 。这可能会令人感到困惑 :) - MB-F
是的,这可能会让人感到困惑;我猜 [T]&[T]&mut [T] 都可以被称为切片,但是引用变体最有用,因此这个名称最常用于它们。 - ljedrz
NIT: 方法调用解析(在最后一个链接中引用)在传递参数时与类型强制转换略有不同,因为self可以隐式引入间接性T -> &T,而对于普通参数则不会这样做。 - kmdreko

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