我不明白为什么函数get同时与Vec<T>和&Vec<T>一起工作。我知道&Vec<T>会自动转换为&[T],所以在某种意义上,问题是为什么它能在Vec<T>和&[T]上工作。显然,get与&[T]一起工作,所以除了对&[T]的实现之外,它是否单独为Vec<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);
}发布于 2020-06-05 23:02:04
这是由于自动引用。
来自方法语法的Rust编程语言.
铁锈有一个叫做自动引用和反引用的功能..。使用
object.something()调用方法时,Rust会自动添加&、&mut或*以便对象匹配该方法的签名。换言之,以下情况相同: P1.距离(&p2);(&p1).distance(&p2); 第一个看起来干净多了。这种自动引用行为之所以有效,是因为方法有一个清晰的接收器--self类型。给定方法的接收方和名称,Rust可以确定该方法是读取(&self)、变异(&mut self)还是消耗(self)。在实践中,锈蚀使方法接收者隐式借用是使所有权符合人体工程学的一个重要部分。
https://stackoverflow.com/questions/62225239
复制相似问题