gpt4 book ai didi

rust - 如何将 min_by_key 或 max_by_key 与迭代期间创建的值的引用一起使用?

转载 作者:行者123 更新时间:2023-11-29 08:15:59 25 4
gpt4 key购买 nike

我有一个迭代器映射一些值,在途中创建元组。我需要通过元组中的一个元素(不是 Copy)获得最大值,但内部引用妨碍了(如 was expected when it got stabilised )。

我怎样才能做出这样的作品?

// Not a Copy type!
#[derive(Ord, PartialOrd, Eq, PartialEq)]
struct t(i8);

fn main() {
// This works
let v = vec![(t(0),), (t(1),)];
v.iter().min_by_key(|v| &v.0);

// This doesn't
let v = vec![0, 1];
v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
}

Playground

error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
--> src/main.rs:12:47
|
12 | v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 12:43...
--> src/main.rs:12:43
|
12 | v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
| ^^^^^^^^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:12:47
|
12 | v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
| ^^^^
note: but, the lifetime must be valid for the method call at 12:5...
--> src/main.rs:12:5
|
12 | v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...so that a type/lifetime parameter is in scope here
--> src/main.rs:12:5
|
12 | v.iter().map(|i| (t(*i),)).min_by_key(|v| &v.0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

最佳答案

他们不能。当值流经迭代器适配器时,它们会被移动。移动一个值会导致对它的任何引用失效。您正在尝试引用仅存在于迭代器管道中的值;引用不能活得足够长。这相当于这个基本示例:

(0..9).map(|x| &x)

您将需要使用 Iterator::min_by :

v.iter().map(|i| (X(*i),)).min_by(|a, b| a.0.cmp(&b.0));

这是可行的,因为闭包的返回值是一个 Ordering,没有对原始值的引用。

关于rust - 如何将 min_by_key 或 max_by_key 与迭代期间创建的值的引用一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49311954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com