相关疑难解决方法(0)

如何将捕获的变量移动到闭包内的闭包中?

此代码是从迭代器生成一组唯一项的低效方法.为了实现这一点,我试图用a Vec来跟踪我所见过的值.我认为这Vec需要由最里面的封闭所拥有:

fn main() {
    let mut seen = vec![];
    let items = vec![vec![1i32, 2], vec![3], vec![1]];

    let a: Vec<_> = items
        .iter()
        .flat_map(move |inner_numbers| {
            inner_numbers.iter().filter_map(move |&number| {
                if !seen.contains(&number) {
                    seen.push(number);
                    Some(number)
                } else {
                    None
                }
            })
        })
        .collect();

    println!("{:?}", a);
}
Run Code Online (Sandbox Code Playgroud)

但是,编译失败了:

error[E0507]: cannot move out of captured outer variable in an `FnMut` closure
 --> src/main.rs:8:45
  |
2 |     let mut seen = vec![];
  |         -------- captured outer variable
...
8 |             inner_numbers.iter().filter_map(move …
Run Code Online (Sandbox Code Playgroud)

closures rust

21
推荐指数
2
解决办法
9285
查看次数

无法移出"Fn"闭包中捕获的外部变量

我试图弄清楚如何通过一个通道发送一个函数,以及如何避免额外的克隆,以便在另一端执行该函数.如果我在闭包内删除额外的克隆操作,我会收到以下错误:

error: cannot move out of captured outer variable in an 'Fn' closure
Run Code Online (Sandbox Code Playgroud)

忽略这个代码绝对没有任何东西,并使用全局可变静态这一事实Sender<T>,它代表了我正在尝试实现的同时给出正确的编译器错误.这段代码不打算运行,只是编译.

use std::ops::DerefMut;
use std::sync::{Arc, Mutex};
use std::collections::LinkedList;
use std::sync::mpsc::{Sender, Receiver};

type SafeList = Arc<Mutex<LinkedList<u8>>>;
type SendableFn = Arc<Mutex<(Fn() + Send + Sync + 'static)>>;
static mut tx: *mut Sender<SendableFn> = 0 as *mut Sender<SendableFn>;

fn main() {
    let list: SafeList = Arc::new(Mutex::new(LinkedList::new()));
    loop {
        let t_list = list.clone();
        run(move || {
            foo(t_list.clone());
        });
    }
}

fn run<T: Fn() + Send + Sync …
Run Code Online (Sandbox Code Playgroud)

function-pointers channel rust

18
推荐指数
1
解决办法
4215
查看次数

什么时候应该将mut添加到闭包中?

fn main() {
    let mut a = String::from("a");
    let closure = || {
        a.push_str("b");
    };

    closure();
}
Run Code Online (Sandbox Code Playgroud)

这不会编译:

error[E0596]: cannot borrow immutable local variable `closure` as mutable
 --> src/main.rs:7:5
  |
3 |     let closure = || {
  |         ------- consider changing this to `mut closure`
...
7 |     closure();
  |     ^^^^^^^ cannot borrow mutably
Run Code Online (Sandbox Code Playgroud)

如果我a在闭包中返回而不添加mut,则可以编译:

fn main() {
    let mut a = String::from("a");
    let closure = || {
        a.push_str("b");
        a
    };

    closure();
}
Run Code Online (Sandbox Code Playgroud)

这让我很困惑.似乎在我打电话的时候closure(), …

rust

8
推荐指数
1
解决办法
571
查看次数

标签 统计

rust ×3

channel ×1

closures ×1

function-pointers ×1