Sto cercando di capire come inviare una funzione attraverso un canale e come evitare la clonazione extra per eseguire la funzione dall'altra parte. Se rimuovo l'operazione in più di clonazione all'interno della chiusura, ottengo il seguente errore:Impossibile spostare la variabile esterna catturata in una chiusura `Fn`
error: cannot move out of captured outer variable in an 'Fn' closure
Ignorando il fatto che questo codice non fa assolutamente nulla, e si avvale di un globale mutabile statica Sender<T>
, rappresenta quello che sto cercando di ottenere dando gli errori del compilatore corretti. Questo codice è non destinato a essere eseguito, appena compilato.
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 + 'static>(task: T) {
unsafe {
let _ = (*tx).send(Arc::new(Mutex::new(task)));
}
}
#[allow(dead_code)]
fn execute(rx: Receiver<SendableFn>) {
for t in rx.iter() {
let mut guard = t.lock().unwrap();
let task = guard.deref_mut();
task();
}
}
#[allow(unused_variables)]
fn foo(list: SafeList) { }
C'è un metodo migliore per aggirare quell'errore e/o un altro modo in cui dovrei inviare le funzioni attraverso i canali?
Sfortunatamente, la mia unica opzione è stabile. Sembra che tu abbia appena confermato ciò che ho già provato e capito, ma qualcun altro potrebbe trovare questo super-aiuto che ha la capacità di usarlo ogni notte. Grazie :) – nathansizemore
Puoi usare un trucco. Usi ancora un 'Fn' e muovi solo in' Option's con cui esci con 'take'. Quindi si verifica un errore di runtime quando si usa male il 'Fn' –
Cosa succede se ho bisogno di un' Fn', a causa di un requisito di libreria. –