FnMut не может быть клонирован по понятным причинам.
Однако Fn имеет непреложный объем; есть ли способ создать "дубликат" Fn?
Попытка клонирования приводит к:
&mut core::ops::Fn(logger::Level, &'a collections::string::String) + Sendне реализует какой-либо метод в области с именемclone
Или безопасно каким-то образом передать необработанный указатель на Fn, например:
let func_pnt = &mut Box<Fn<...> + Send> as *mut Box<Fn<...>>
Технически вышеупомянутое работает, но кажется довольно странным.
Humm, хорошо, вот пример того, что я пытаюсь сделать:
#![feature(unboxed_closures)]
use std::thread::Thread;
use std::clone::Clone;
struct WithCall {
  fp:Box<Fn<(i8,i8), i8> + Send>
}
impl WithCall {
  pub fn new(fp:Box<Fn<(i8,i8), i8> + Send>) -> WithCall {
    return WithCall {
      fp: fp
    };
  }
  pub fn run(&self, a:i8, b:i8) -> i8 {
    return self.fp.call((a, b));
  }
}
unsafe impl Send for WithCall {}
impl Clone for WithCall {
  fn clone(&self) -> WithCall {
    return WithCall {
      fp: self.fp.clone()
    };
  }
}
fn main() {
  let adder = WithCall::new(Box::new(|&:a:i8, b:i8| -> i8 { 
    return a + b;
  }));
  println!("{}", adder.run(1, 2));
  let add_a = adder.clone();
  let add_b = adder.clone();
  Thread::scoped(move || {
    println!("In remote thread: {}", add_a.run(10, 10));
  });
  Thread::scoped(move || {
    println!("In remote thread: {}", add_b.run(10, 10));
  });
}
т. У вас есть структура с коротким замыканием в ней, вам нужно передать эту структуру на ряд задач; очевидно, вы не можете.... но вы также не можете клонировать его, потому что вы не можете клонировать Box<Fn<>>, и вы не можете клонировать &Fn<...>
playpen: http://is.gd/1oNPYJ
