为什么这不是悬挂参考?

m00*_*0am 3 rust

我正在关注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完成后使引用无效?

Mat*_* M. 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
}
Run Code Online (Sandbox Code Playgroud)

l参考过,克隆片其实只是返回片本身,与同寿命.

因此,将引用引入切片是完全正常的,并且返回值会借用原始切片.

  • @ m00am:出于调试目的,一个有用的技巧是使用`let x :()= ...;`然后让编译器告诉你错误消息中的类型. (8认同)