为什么`get`可以同时在std :: vec :: Vec和&std :: vec :: Vec上使用?

时间:2020-06-05 22:55:17

标签: rust reference

我很困惑为什么函数getVec<T>&Vec<T>都可以使用。我知道&Vec<T>会自动转换为&[T],所以从某种意义上说,问题是为什么它既可以在Vec<T>上也可以在&[T]上使用。显然,get&[T]一起使用,那么除了Vec<T>的实现之外,它是否还为&[T]单独实现?看一下文档,看起来好像不是这样,只有一个get实现:https://doc.rust-lang.org/std/vec/struct.Vec.html#method.get

在以下代码中,get作用于Vec<T>

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

在此代码中,它作用于&Vec<T>(又名&[T]):

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

1 个答案:

答案 0 :(得分:4)

这是由于自动引用。

来自Method Syntax的Rust编程语言...

Rust具有称为自动引用和取消引用 [...]的功能,当您使用object.something()调用方法时,Rust自动添加&,{{1} }或&mut,使object匹配方法的签名。换句话说,以下是相同的:

*

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