Rust error[E0373]:闭包可能比当前函数寿命长,但它借用了“迭代”索引`

Rust error[E0373]:闭包可能比当前函数寿命长,但它借用了“迭代”索引`,rust,closures,borrow-checker,Rust,Closures,Borrow Checker,我有两个向量。我需要遍历第一个向量,对于每个元素,遍历第二个向量,检查第一个向量的最小值是否等于第二个向量中任何元素的最大值,反之亦然。以下是我尝试过的MCVE: 使用itertools::MinMaxResult;//itertools=“0.8.0” 使用itertools::MinMaxResult::*; pub fn mcve()->Vec{ //使MCVE编译的伪变量 设num_rows=0; 设num_cols=0; 让行_minmax:Vec=Vec![]; 设col_minma

我有两个向量。我需要遍历第一个向量,对于每个元素,遍历第二个向量,检查第一个向量的最小值是否等于第二个向量中任何元素的最大值,反之亦然。以下是我尝试过的MCVE:

使用itertools::MinMaxResult;//itertools=“0.8.0”
使用itertools::MinMaxResult::*;
pub fn mcve()->Vec{
//使MCVE编译的伪变量
设num_rows=0;
设num_cols=0;
让行_minmax:Vec=Vec![];
设col_minmax:Vec=Vec![];
//问题代码:
(0..num_行)
.平面图(行索引){
(0_usize..num_cols).filter_map(| col_index|{
匹配(行最小值[行索引]、列最小值[列索引]){
如果a==d=>
一些((行索引,列索引)),
如果b==c=>
一些((行索引,列索引)),
_=>没有,
}
})
})
收集::()
}

我得到以下错误:

error[E0373]:闭包可能比当前函数更有效,但它借用了“row\u index”,
属于当前函数的
-->src/main.rs:15:48
|
15 |(0 | usize..num_cols)。筛选映射(| col_index |{
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
借入值`行索引`
16 |匹配(行最小值[行索引]、列最小值[列索引]){
|------------“row_index”在此处借用
|
注意:此处返回闭包
-->src/main.rs:15:17
|
15 |/(0_usize..num_cols)。筛选映射(| col_index |{
16 | |匹配(行最小值[行索引]、列最小值[列索引]){
如果a==d=>
一些((行索引,列索引)),
如果b==c=>
一些((行索引,列索引)),
19 | | |=>无,
20 | |                     }
21 | |                 })
| |__________________^
帮助:强制关闭以获得“行索引”的所有权
(以及任何其他引用的变量),使用'move'关键字
|
15 |(0 | usize..num_cols)。筛选映射(移动| col|u索引|{
|                                                ^^^^^^^^^^^^^^^^

如果我添加一个
移动
,正如编译器所建议的,我会得到两倍的错误,因此这没有帮助。我如何消除这个错误?

您的链接要点有一大堆典型的“与借阅检查器搏斗”错误。下面是解决这些错误的方法:

  • 按照编译器的建议使用
    move
    ,但确保所有移动的值都实现
    Copy
  • 类型为
    usize
    的迭代索引已经实现了
    Copy
    ,所以这里没有什么可做的
  • 向量是有问题的,所以只需获取它们的不可变引用,并将不可变引用传递到闭包中即可
  • 您的
    进入\u par\u iter
    会导致不相关的所有权问题。只需使用
    par\u iter
    ,然后您将迭代引用,而不是实际值,并且在迭代矩阵时不会破坏矩阵
本文件汇编如下:

使用itertools::MinMaxResult;//itertools=“0.8.0”
使用itertools::MinMaxResult::*;
使用itertools::itertools;
使用人造丝::前奏::*;//人造丝=“1.0.3”
发布fn查找鞍点(输入:&[Vec])->Vec{
让展平矩阵:Vec=input.into_par_iter().flatte().collect();
如果展平,则矩阵为空(){
vec![]
}否则{
让num_rows=input.len();
设num_cols=input[0].len();
让行_minmax:Vec=输入
.国际热核实验堆(iter)
.map(| row | row.iter().minmax())
收集::();
让输入设置为:Vec=(0使用..num\u cols)
.into_par_iter()
.map(| col|u索引|{
(0使用..行数)
.map(|行索引|输入[行索引][列索引])
收集::()
})
.收集();
//不要当家作主!
//改用'par_iter',然后'col'将作为参考,
//借钱人也很高兴。
设col_minmax:Vec=input_transpose
.par_iter()
.map(| col | col.iter().minmax())
.收集();
设rmm_ref=&row_minmax;
设cmm_ref=&col_minmax;
(0使用..行数)
.平面图(行索引){
(0_usize..num_cols).filter_map(移动|列|索引|{
匹配(rmm\U ref[行索引]、cmm\U ref[列索引]){
如果a==d=>
一些((行索引,列索引)),
如果b==c=>
一些((行索引,列索引)),
_=>没有,
}
})
})
收集::()
}
}
fn main(){}

您链接的要点有一大堆典型的“与借阅检查人较量”错误。以下是解决这些错误的方法: