Невозможно вернуть ссылку на временное значение в flat_map - PullRequest
2 голосов
/ 12 октября 2019

Со следующей упрощенной / обобщенной версией моей проблемы:

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 голосов
/ 31 октября 2019

Возвращение ссылки на элемент вне функции, в которой он создан, напрямую нарушает свойство владения Rust - см. Здесь .

При желании вернуть данные в срез, используйте Vec.

Решение ниже:

https://play.rust -lang.org /? Version = stable & mode =отладка и выпуск = 2018 & сути = cc76fd3f1bc0aef7b7c2a60a35d40cc6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...