![](/img/trans.png)
[英]How to return the value of a reference field of a struct that is no longer used without 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.