为什么这不是悬挂参考?

时间:2017-12-11 09:55:38

标签: rust

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

1 个答案:

答案 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也是引用,克隆切片实际上只返回切片本身,具有相同的生命周期。

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