명백한 이유 때문에 FnMut을 복제 할 수 없습니다.클로저를 복제 할 수 있습니까?
그러나 Fn에는 변경할 수없는 범위가 있습니다. Fn의 '중복'을 만드는 방법이 있습니까?
&mut core::ops::Fn(logger::Level, &'a collections::string::String) + Send
does not implement any method in scope namedclone
아니면 어떻게 든처럼 주위 FN에 원시 포인터를 전달하는 것이 안전합니다 :
그 결과 복제하려고let func_pnt = &mut Box<Fn<...> + Send> as *mut Box<Fn<...>>
기술적으로 위의 작품 만 보인다 아주 이상한.
#![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));
});
}
예 :
는 HUMM는, 좋아, 여기에 내가 할 노력하고있어의 예입니다. boxed closure가있는 구조체를 가지고 있다면 구조체를 여러 작업에 전달해야합니다. 분명히 당신은 할 수 없습니다. ...하지만 당신이 Box<Fn<>>
를 복제 할 수없고 당신이 &Fn<...>
놀이 틀 복제 할 수 없기 때문에 당신은 또한 그것을 복제 할 수 없습니다 폐쇄가 자신의 환경을 캡처 기억 http://is.gd/1oNPYJ
는 당신이 복제 된 폐쇄와 함께 할 싶은 구조체에
Fp
주위Arc
를 추가 받았죠? – Shepmaster전체 코드는 무엇입니까? – huon
@shepmaster 특히 변경 가능한 상태가 아닌 클로저를 동시에 여러 작업으로 옮기고 싶습니다. 첨부 된 예를 참조하십시오. – Doug