变量在地图中的生存时间不够长

时间:2018-08-20 20:27:29

标签: rust

我正在尝试将矩阵A转换为矩阵B,其中B_11将成为元组中第一行的最大元素,第二行的最小元素。因此矩阵[1,2; 3,4]将变为[(2,1),(2,2); (4,1),(4,2)]。

pub fn find_saddle_points(input: &[Vec<u64>]) -> Vec<(usize, usize)> {
    let answer = Vec::new();
    println!("matrix: {:?}", input);
    let x: Vec<Vec<_>> = input
        .iter()
        .map(|row| {
            row.iter()
                .map(move |_| {
                    let y = get_column(&input, 0);
                    println!("y is {:?}", y);
                    let x = get_lowest(&y);
                    (get_highest(row), x)
                }).collect()
        }).collect();
    println!("x is {:?}", x);
    answer
}

fn get_highest(row: &Vec<u64>) -> &u64 {
    row.iter().max().unwrap()
}

fn get_lowest(column: &Vec<u64>) -> &u64 {
    column.iter().min().unwrap()
}

fn get_column(matrix: &[Vec<u64>], index: usize) -> Vec<u64> {
    matrix.iter().map(|row| row[index]).collect()
}

尝试使用y时收到错误消息:

error[E0597]: `y` does not live long enough
  --> src/lib.rs:11:41
   |
11 |                     let x = get_lowest(&y);
   |                                         ^ borrowed value does not live long enough
12 |                     (get_highest(row), x)
13 |                 }).collect()
   |                 - `y` dropped here while still borrowed
...
17 | }
   | - borrowed value needs to live until here                          

我不明白为什么值y必须一直使用到使用之后。生存到get_lowest函数之后还不够吗? 我该如何解决?

2 个答案:

答案 0 :(得分:0)

Shepmaster解释得很好

  

TL; DR-创建了Vec y,然后获得了对向量的引用   通过get_highest和get_lowest。退出封包时,Vec是   销毁,引用将一无所获。编译器是   防止您犯可能导致记忆的重大错误   像C或C ++这样的语言是不安全的。

答案 1 :(得分:0)

您可以使用clone()函数将向量的新副本传递给函数get_highestget_lowest,并使函数返回整数,而不返回带有函数{{1}的引用}。

to_owned()

正如@shepmaster所说,您应该避免将Vector的引用用作函数参数。