Rust 为什么“get”对std::vec::vec和&std::vec::vec都起作用?

Rust 为什么“get”对std::vec::vec和&std::vec::vec都起作用?,rust,reference,Rust,Reference,我不明白为什么get函数同时适用于Vec和&Vec。我知道&Vec会自动转换为&[T],所以在某种意义上,问题是为什么它能在Vec和&[T]上工作。显然,get与&[T]一起工作,那么除了对&[T]的实现之外,它是否对Vec单独实现?查看文档,看起来不是这样,只有一个get实现: 在下面的代码中,get作用于Vec 这是由于自动引用 从Rust编程语言中 当您使用object调用方法时,Rust有一个称为自动引用和取消引用[…]的功能。在某些情况下,Rust会自动添加&、&mut或*以便obje

我不明白为什么get函数同时适用于Vec和&Vec。我知道&Vec会自动转换为&[T],所以在某种意义上,问题是为什么它能在Vec和&[T]上工作。显然,get与&[T]一起工作,那么除了对&[T]的实现之外,它是否对Vec单独实现?查看文档,看起来不是这样,只有一个get实现:

在下面的代码中,get作用于Vec


这是由于自动引用

从Rust编程语言中

当您使用object调用方法时,Rust有一个称为自动引用和取消引用[…]的功能。在某些情况下,Rust会自动添加&、&mut或*以便object与方法的签名匹配。换句话说,以下内容是相同的:

p1.distance(&p2);
(&p1).distance(&p2);
第一个看起来干净多了。这种自动引用行为之所以有效,是因为方法有一个明确的接收者,即self类型。给定方法的接收者和名称,Rust可以确定该方法是读取自我、变异自我还是消费自我。锈迹使方法接受者的借用隐式化,这一事实是使所有权在实践中符合人体工程学的一个重要部分

fn first<T: PartialOrd + Copy>(list: &Vec<T>) -> T {
    *list.get(0).unwrap()
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];
    let result = first(&number_list);
    println!("The first number is {}", result);
}
p1.distance(&p2);
(&p1).distance(&p2);