繁体   English   中英

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

[英]How to return a reference without requiring Copy trait?

Rust 编程语言一个示例 function 返回切片的最大元素 有人提到,应该可以返回对该值的引用,而不是返回该值,这将允许我们将此 function 与不实现Copy特征的类型一起使用。

返回值的初始 function 如下所示:

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
}

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

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM