gpt4 book ai didi

rust - 如何以函数样式编写惰性计算的double for循环?

转载 作者:行者123 更新时间:2023-12-03 11:42:29 25 4
gpt4 key购买 nike

如何在Rust中以函数样式编写延迟评估的double for循环?
借入的值是usize类型的,应该是可复制的。

fn main() {
let numbers: Vec<i32> = (1..100).collect();
let len = numbers.len();

let _sums_of_pairs: Vec<_> = (0..len)
.map(|j| ((j + 1)..len).map(|k| numbers[j] + numbers[k]))
.flatten()
.collect();
}
error[E0373]: closure may outlive the current function, but it borrows `j`, which is owned by the current function
--> src/bin/example.rs:6:37
|
6 | .map(|j| ((j + 1)..len).map(|k| numbers[j] + numbers[k]))
| ^^^ - `j` is borrowed here
| |
| may outlive borrowed value `j`
|
note: closure is returned here
--> src/bin/example.rs:6:18
|
6 | .map(|j| ((j + 1)..len).map(|k| numbers[j] + numbers[k]))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: to force the closure to take ownership of `j` (and any other referenced variables), use the `move` keyword
|
6 | .map(|j| ((j + 1)..len).map(move |k| numbers[j] + numbers[k]))
| ^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0373`.
进一步说明
  • 我知道Itertools::combinations(2)可以完成这项工作。但是,我不想使用它,因为(1)我想自己知道如何做,以及(2)这可能是我的代码运行缓慢的原因,并且我想消除该源代码。 (更新:Itertools::tuple_combinations<(_, _)>()快得多,并且可以用一种功能样式进行编码。)
  • 我也尝试过先将其收集到容器中。 (0..len).collect::<Vec<_>>().iter().cloned().map(...)
  • 我尝试了建议的move,但随后numbers也移动了,因此在下一个循环中不可用。
  • 在此代码示例中,任何地方都没有线程或异步发生。
  • Shepmaster在this回答中说,我无法对闭包进行生命周期注释。
  • 我之所以不写两个带有早期返回的原始循环的原因是,如果我想说,请运行.any()以查找是否存在特定值,我将不得不将这两个循环移到一个单独的函数中,因为我无法除非在单独的函数中,否则将return true;放入循环中。
  • 最佳答案

    要变通解决此问题,您可以预先借用&numbers,而只需阴影numbers。然后,您可以将move添加到第二个闭包中。

    fn main() {
    let numbers: Vec<i32> = (1..100).collect();
    let len = numbers.len();

    let numbers = &numbers;

    let _sums_of_pairs: Vec<_> = (0..len)
    .map(|j| ((j + 1)..len).map(move |k| numbers[j] + numbers[k]))
    .flatten()
    .collect();
    }

    关于rust - 如何以函数样式编写惰性计算的double for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65258521/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com