स्पष्ट कारणों से एक एफएनएमट क्लोन नहीं किया जा सकता है।क्या आप बंद कर सकते हैं?
हालांकि, एक एफएन में एक अपरिवर्तनीय गुंजाइश है; क्या एफएन का 'डुप्लिकेट' बनाने का कोई तरीका है?
क्लोन करने के लिए यह परिणाम कोशिश कर रहा है:
&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, ठीक है, यहाँ मैं क्या कर रहा हूँ का एक उदाहरण है। आपके पास एक बॉक्स किए गए बंद होने के साथ एक संरचना है, आपको उस संरचना को कई कार्यों में पारित करने की आवश्यकता है; जाहिर है आप नहीं कर सकते। ... लेकिन आप भी यह क्लोन नहीं कर सकते, क्योंकि आप एक Box<Fn<>>
क्लोन नहीं कर सकते हैं और आप एक &Fn<...>
playpen क्लोन नहीं कर सकते हैं: http://is.gd/1oNPYJ
क्या आप क्लोन बंद के साथ करना चाहते हैं में
Arc
Fp
चारों ओर जोड़ने समाप्त? – Shepmasterआपका पूरा कोड क्या है? – huon
@shepmaster मैं विशेष रूप से एक ही समय में कई कार्यों में स्थानांतरित करने के लिए उत्परिवर्तनीय स्थिति के बिना बंद करना चाहता हूं। मैंने जो उदाहरण संलग्न किया है उसे देखें। – Doug