无法返回对flat_map中的临时值的引用

时间:2019-10-12 06:18:47

标签: rust

以下是我的问题的简化/摘要版本:

fn main() {
    let arr = vec![1., 2., 3., 4., 5., 6., 7., 8., 9.];
    let size = arr.len();

    let wave = |res: &Vec<f64>, step| {
        let size = res.len();
        let factor = size / (2 * step);
        res.chunks_exact(2)
            .collect::<Vec<_>>()
            .chunks_exact(factor)
            .flat_map(|arr| {
                arr.into_iter().flat_map(|x| {
                    &[(x[0] + x[1]), (x[0] - x[1])]
                })
            })
            .cloned()
            .collect::<Vec<_>>()
    };

    println!("{:?}", &arr);

    let mut res = arr.clone();
    for step in 1..size / 2 {
        res = wave(&res, step);
        println!("{:?}", &res);
    }
}

错误:

error[E0515]: cannot return reference to temporary value
  --> src/main.rs:34:21
   |
34 |                     &[(x[0] + x[1]), (x[0] - x[1])]
   |                     ^------------------------------
   |                     ||
   |                     |temporary value created here
   |                     returns a reference to data owned by the current function

如果删除.cloned()方法,但出现下一个问题:

不匹配的类型:

error[E0308]: mismatched types
  --> src/main.rs:23:15
   |
23 |         res = wave(&res, step);
   |               ^^^^^^^^^^^^^^^^ expected f64, found &f64
   |
   = note: expected type `std::vec::Vec<f64>`
              found type `std::vec::Vec<&f64>`

1 个答案:

答案 0 :(得分:1)

在创建该函数的函数之外返回对项目的引用直接违反了Rust的所有权功能-see here

要返回切片中的数据时,请使用Vec。

以下解决方案:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=cc76fd3f1bc0aef7b7c2a60a35d40cc6