Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 按键对数组排序时会出现生锈的生存期问题_Rust_Lifetime - Fatal编程技术网

Rust 按键对数组排序时会出现生锈的生存期问题

Rust 按键对数组排序时会出现生锈的生存期问题,rust,lifetime,Rust,Lifetime,在实现argmax函数时,我遇到了一些问题。以下是MVCE(链接到): fn main(){ 设c=[4,5,6,1]; 设min=argmin(&c); println!(“{}”,min); } fn argmin(arr:&[i32])->使用{ 国际热核实验堆 .enumerate() .min_按|键(|(|,v)| v) .map(|(idx,|)idx) .unwrap() } 这会导致一些生命周期错误: 错误:生命周期可能不够长 -->src/main.rs:10:50 | 1

在实现
argmax
函数时,我遇到了一些问题。以下是MVCE(链接到):

fn main(){
设c=[4,5,6,1];
设min=argmin(&c);
println!(“{}”,min);
}
fn argmin(arr:&[i32])->使用{
国际热核实验堆
.enumerate()
.min_按|键(|(|,v)| v)
.map(|(idx,|)idx)
.unwrap()
}
这会导致一些生命周期错误:

错误:生命周期可能不够长
-->src/main.rs:10:50
|
10 | min|u按|(|,v):&(usize,&i32)| v)
|-^返回此值要求“1”必须比“2”更长寿`
|                                  |             |
||闭合的返回类型为&'2&i32
|让我们将此引用的生存期称为“1”`
错误:由于上一个错误而中止
当然。无法保证对向量最小值的引用比它来自的向量(对向量的引用)更有效。这导致我进行了以下调整(链接到):

fn main(){
设c=[4,5,6,1];
设min=argmin(&c);
println!(“{}”,min);
}
fn argmin usize{
国际热核实验堆
.enumerate()
.min_by_键(|(|,v):&a(usize,&i32)| v)
.map(|(idx,|)idx)
.unwrap()
}
我现在想,Rust可以计算出
c
及其最小值与
argmin
签名中的信息具有相同的寿命。但我收到的是另一个编译器错误:

错误[E0308]:类型不匹配
-->src/main.rs:10:34
|
10 | min|u by|u键(|(|,v):&'a(usize,&i32)| v)
|^^^^^^^^^^^^^^^^^^^^^^生存期不匹配
|
=注意:预期引用`&(usize,&i32)`
找到引用“&”a(usize和i32)`
注意:10:25时在主体上定义的匿名生存期#1。。。
-->src/main.rs:10:25
|
10 | min|u by|u键(|(|,v):&'a(usize,&i32)| v)
|                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
注意:…不一定超过7:11时在函数体上定义的生存期“a”
-->src/main.rs:7:11
|
7 | fn argmin usize{
|           ^^
错误[E0308]:类型不匹配
-->src/main.rs:10:34
|
10 | min|u by|u键(|(|,v):&'a(usize,&i32)| v)
|^^^^^^^^^^^^^^^^^^^^^^生存期不匹配
|
=注意:预期引用`&(usize,&i32)`
找到引用“&”a(usize和i32)`
注:7:11时在函数体上定义的生存期“a”。。。
-->src/main.rs:7:11
|
7 | fn argmin usize{
|           ^^
注意:…不一定超过10:25时在身体上定义的匿名生存期#1
-->src/main.rs:10:25
|
10 | min|u by|u键(|(|,v):&'a(usize,&i32)| v)
|                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这里发生了什么?在我看来,函数签名中的生存期似乎无法与
min\u by\u key
中的生存期相匹配。我们如何使用生存期以正确的方式修复此问题?我们甚至可以这样做吗


注:我知道,只要在第10行使用克隆(
.min_by_key(|(|,v)| v.clone())
)就可以很容易地解决这个问题。

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

fn argmin(arr:&[i32])->usize{
国际热核实验堆
.enumerate()
.min_by_键(|&(|,v):&(usize,&i32)| v)
.map(|(idx,|)idx)
.unwrap()
}

你可以很容易地删除生命周期并让它来处理它们。@谢谢你的评论。这是我第一次尝试的,看看第二个代码块。有趣的是,更简单的
fn argmin(arr:&[i32]){let_min=arr.iter().min_by_key(| v | v)。unwrap()}
也无法构建()使用与第一个代码段相同的生存期错误。我对该代码的实际问题感到好奇-它不像闭包返回对本地值的引用,它返回在参数中接收到的引用,并且该引用“显然”存在足够长的时间。将
min_by_key(|v | v)
替换为
min()
编译。非常感谢您的回答,这使解决方案变得清晰。因此,实际的问题是,双参考
和&i32
在默认情况下比向量有另一个生存期?@pythonic833,没错