我很困惑为什么该函数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)
这是由于自动参考。
\n\n来自Rust 编程语言中的方法语法...
\n\n\n\nRust 有一个称为自动引用和取消引用的功能[...] 当您使用 调用方法时
\n\nobject.something(),Rust 会自动添加&、&mut或*与该方法的签名匹配的对象。换句话说,以下内容是相同的:Run Code Online (Sandbox Code Playgroud)\n\np1.distance(&p2);\n(&p1).distance(&p2);\n第一个看起来干净得多。这种自动引用行为之所以有效,是因为方法有一个明确的接收者\xe2\x80\x94类型的
\nself. 给定方法的接收者和名称,Rust 可以明确地确定该方法是否正在读取 (&self)、变异 (&mut self) 或消耗 (self)。事实上,Rust 使方法接收者隐式借用,这是在实践中使所有权符合人体工程学的一个重要部分。