Невозможно выйти из захваченной внешней переменной в закрытии `Fn`

Я пытаюсь выяснить, как отправить функцию через канал и как избежать дополнительного клонирования, чтобы выполнить функцию на другом конце. Если я удаляю лишнюю операцию клонирования внутри замыкания, я получаю следующую ошибку:

error: cannot move out of captured outer variable in an 'Fn' closure

Игнорирование того факта, что этот код абсолютно ничего не делает, и использует глобальную изменяемую статическую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 + '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) { }

Есть ли лучший способ обойти эту ошибку и / или другой способ отправки функций по каналам?

Ответы на вопрос(1)

Ваш ответ на вопрос