为什么 `get` 对 std::vec::Vec 和 &std::vec::Vec 都有效?

pic*_*ard 2 reference rust

我很困惑为什么该函数get适用于Vec<T>&Vec<T>。我知道在某种意义上&Vec<T>会自动转换为&[T]so ,问题是为什么它可以在Vec<T>以及&[T]. 显然,get适用于,那么除了 的实现之外,&[T]它是否还单独实现了?查看文档,似乎不是这样,只有一种实现:https://doc.rust-lang.org/std/vec/struct.Vec.html#method.getVec<T>&[T]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);
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,它作用于&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);
}
Run Code Online (Sandbox Code Playgroud)

Sch*_*ern 5

这是由于自动参考。

\n\n

来自Rust 编程语言中的方法语法...

\n\n
\n

Rust 有一个称为自动引用和取消引用的功能[...] 当您使用 调用方法时object.something(),Rust 会自动添加&&mut*与该方法的签名匹配的对象。换句话说,以下内容是相同的:

\n\n
p1.distance(&p2);\n(&p1).distance(&p2);\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一个看起来干净得多。这种自动引用行为之所以有效,是因为方法有一个明确的接收者\xe2\x80\x94类型的self. 给定方法的接收者和名称,Rust 可以明确地确定该方法是否正在读取 ( &self)、变异 ( &mut self) 或消耗 ( self)。事实上,Rust 使方法接收者隐式借用,这是在实践中使所有权符合人体工程学的一个重要部分。

\n
\n