簡體   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