我正在关注TRPL第二版(第二版),并对其中一项任务感到困惑.在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
}
Run Code Online (Sandbox Code Playgroud)
这将返回对克隆列表的项的引用.而且,瞧,它编译.为什么这不是悬挂参考(如第4.2节所述)?
据我了解,largest
包含对(克隆)副本的项目的引用list
,但不应l
超出范围,从而在largest
完成后使引用无效?
因为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
}
Run Code Online (Sandbox Code Playgroud)
l
是参考过,克隆片其实只是返回片本身,与同寿命.
因此,将引用引入切片是完全正常的,并且返回值会借用原始切片.