此代码是从迭代器生成一组唯一项的低效方法.为了实现这一点,我试图用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) 我试图弄清楚如何通过一个通道发送一个函数,以及如何避免额外的克隆,以便在另一端执行该函数.如果我在闭包内删除额外的克隆操作,我会收到以下错误:
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) 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(), …