gpt4 book ai didi

rust - 按键对数组排序时的Rust生命周期问题

转载 作者:行者123 更新时间:2023-12-03 11:36:15 26 4
gpt4 key购买 nike

在实现argmax函数时遇到一些问题。这是MVCE(指向v1 playground的链接):

fn main() {
let c = [4,5,6,1];
let min = argmin(&c);
println!("{}", min);
}

fn argmin(arr: &[i32]) -> usize {
arr.iter()
.enumerate()
.min_by_key(|(_, v)| v)
.map(|(idx, _)| idx)
.unwrap()
}
这会导致一些生命周期错误:
error: lifetime may not live long enough
--> src/main.rs:10:50
|
10 | .min_by_key(|(_, v): &(usize, &i32)| v)
| - - ^ returning this value requires that `'1` must outlive `'2`
| | |
| | return type of closure is &'2 &i32
| let's call the lifetime of this reference `'1`

error: aborting due to previous error
的确。不能保证对向量最小值的引用要比从其来的向量的引用生命周期更长。这导致我进行以下修改(链接到 v2 playground):
fn main() {
let c = [4,5,6,1];
let min = argmin(&c);
println!("{}", min);
}

fn argmin<'a>(arr: &'a [i32]) -> usize {
arr.iter()
.enumerate()
.min_by_key(|(_, v): &'a (usize, &i32)| v)
.map(|(idx, _)| idx)
.unwrap()
}
我现在想,Rust可以根据 c签名中的信息来确定 argmin及其最小值具有相同的生存期。但是我收到的是另一个编译器错误:
error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | .min_by_key(|(_, v): &'a (usize, &i32)| v)
| ^^^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected reference `&(usize, &i32)`
found reference `&'a (usize, &i32)`
note: the anonymous lifetime #1 defined on the body at 10:25...
--> src/main.rs:10:25
|
10 | .min_by_key(|(_, v): &'a (usize, &i32)| v)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...does not necessarily outlive the lifetime `'a` as defined on the function body at 7:11
--> src/main.rs:7:11
|
7 | fn argmin<'a>(arr: &'a [i32]) -> usize {
| ^^

error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | .min_by_key(|(_, v): &'a (usize, &i32)| v)
| ^^^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected reference `&(usize, &i32)`
found reference `&'a (usize, &i32)`
note: the lifetime `'a` as defined on the function body at 7:11...
--> src/main.rs:7:11
|
7 | fn argmin<'a>(arr: &'a [i32]) -> usize {
| ^^
note: ...does not necessarily outlive the anonymous lifetime #1 defined on the body at 10:25
--> src/main.rs:10:25
|
10 | .min_by_key(|(_, v): &'a (usize, &i32)| v)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是怎么回事在我看来,函数签名中的生存期似乎无法与 min_by_key中的生存期相匹配。我们如何使用生命周期以正确的方式解决此问题?我们还能做到吗?
附注:我知道,只需在第10行中使用克隆( .min_by_key(|(_, v)| v.clone())),即可轻松解决此问题。

最佳答案

因此,这有点棘手,但这是由于双重引用造成的。如果我是对的。注意双重引用&(usize, &i32)。因此,实际上,您得到的是&usize&&i32。为了解决这个问题,只需匹配闭包中的外部引用:

fn argmin(arr: &[i32]) -> usize {
arr.iter()
.enumerate()
.min_by_key(|&(_, v): &(usize, &i32)| v)
.map(|(idx, _)| idx)
.unwrap()
}
Playground

关于rust - 按键对数组排序时的Rust生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65966333/

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