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