如何在不需要 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
}
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
}