如何在不需要 Copy 特征的情况下 return 引用?

How to return a reference without requiring Copy trait?

Rust 编程语言an example function that returns the largest element of a slice。有人提到,而不是 returning 值,应该可以 return 对该值的引用,这将允许我们将此函数与不实现 Copy 的类型一起使用特质。

return值的初始函数如下所示:

fn largest<T>(list: &[T]) -> T
where
    T: PartialOrd + Copy,
{
    let mut largest = list[0];

    for &item in list {
        if item > largest {
            largest = item;
        }
    }
    largest
}

一段时间以来我一直在尝试修改它,以便 return 指向该值而不是该值本身的指针。我在想这也可以使用索引来实现,但我想知道是否没有其他方法可以像这次尝试一样进行:

fn largest<'a, T: 'a>(list: &'a [T]) -> &'a T
where
    &'a T: PartialOrd,
{
    let mut largest = &list[0];

    for &item in list {
        if item > *largest {
            largest = &item;
        }
    }
    largest
}

这段代码无法编译,编译器一直在恐慌,因为我显然遗漏了一些东西。在这种情况下,它拒绝应用二元运算“>”,即使我在“跟随”可以说是它所代表的值最大的指针:

error[E0369]: binary operation `>` cannot be applied to type `T`
 --> src/lib.rs:8:17
  |
8 |         if item > *largest {
  |            ---- ^ -------- T
  |            |
  |            T
  |
help: consider further restricting type parameter `T`
  |
3 |     &'a T: PartialOrd, T: std::cmp::PartialOrd
  |                      ^^^^^^^^^^^^^^^^^^^^^^^^^

如果有人提示我应该朝哪个方向推进以使这种方法发挥作用(如果可能的话),我将不胜感激?

虽然这并不令人意外,但事实证明这是一个愚蠢的错误: 迭代中的 item 不需要是引用,而且 largest 肯定不需要取消引用。这是该代码的固定版本:

fn largest<'a, T: 'a>(list: &'a [T]) -> &'a T
where
    &'a T: PartialOrd,
{
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = &item;
        }
    }
    largest
}