我正在关注TRPL book(第二版)的第二版,并对其中一项任务感到困惑。在section 10.2(特征)结束时,我被要求使用largest
特征重新实现Clone
函数。 (请注意,此时我还没有学到任何关于有生之年的事情。)我实现了以下
fn largest<T: PartialOrd + Clone>(list: &[T]) -> &T {
let l = list.clone();
let mut largest = &l[0];
for item in l {
if item > &largest {
largest = item;
}
}
largest
}
返回对克隆列表项的引用。而且,瞧,它编译。为什么这不是悬挂参考(如section 4.2中所述)?
据我了解,largest
包含对list
的(克隆)副本的项目的引用,但l
不应超出范围,从而使largest
完成后的引用?
答案 0 :(得分:8)
因为l
没有您认为的类型:
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let l: &[T] = list.clone();
let mut largest = &l[0];
for item in l {
if item > &largest {
largest = item;
}
}
largest
}
l
也是引用,克隆切片实际上只返回切片本身,具有相同的生命周期。
因此,将引用引入切片是完全正确的,并且您的返回值会借用原始切片。