2014-09-03 30 views
9

में कार्यों के बीच विशेषता वस्तुओं को भेजना तो, मैं कार्यों के बीच एक विशेषता वस्तु भेजने में सक्षम होना चाहता हूं, लेकिन यह संभव नहीं है कि यह संभव हो। ऐसा लगता है कि ऐसा नहीं हो सकता है, क्योंकि वे स्पष्ट रूप से Send प्रकार को पूरा नहीं करते हैं।जंग

निम्नलिखित कोड अनिवार्य रूप से दर्शाता है कि मैं क्या करने की कोशिश कर रहा हूँ:

trait Bar { 
    fn bar(&self); 
} 

struct Foo { foo: uint } 

impl Bar for Foo { 
    fn bar(&self) { 
     println!("foo: {}", self.foo); 
    } 
} 

fn main() { 
    let foo = box Foo { foo: 1 } as Box<Bar>; 

    let (tx, rx): (Sender<Box<Bar>>, Receiver<Box<Bar>>) = channel(); 

    spawn(proc() { 
     tx.send(foo); 
    }); 

    let sent = rx.recv(); 

    sent.bar(); 
} 

जंग nightlies का उपयोग करना, यह निम्न संदेश के साथ विफल रहता है:

traittest.rs:16:60: 16:67 error: instantiating a type parameter with an incompatible type Box<Bar+'static> , which does not fulfill Send [E0144]

traittest.rs:16 let (tx, rx): (Sender>, Receiver>) = channel();

मैं के बाकी कतरना गए लाइनें, जो सभी सिर्फ Send को पूरा करने के बारे में शिकायत नहीं करते हैं।

साथ ही, अन्य त्रुटियों के एक झुंड में एक सादा, अनबॉक्स्ड विशेषता वस्तु परिणाम भेजने के लिए, ज्यादातर Send + Sized को पूरा नहीं कर के बारे में शिकायत की कोशिश कर रहा।

मैं अभी भी जंग के लिए बिल्कुल नया हूं, इसलिए मुझे यकीन नहीं है कि मुझे कुछ याद आ रहा है या नहीं। लेकिन मुझे लगता है कि विशेषता वस्तु Send बनाने के लिए कंपाइलर को मनाने का कोई तरीका नहीं है।

यदि यह वर्तमान में संभव नहीं है, तो क्या वर्तमान में कोई काम है जो भविष्य में इसके लिए अनुमति दे सकता है?

उत्तर

9

यह संभव है। आप इस तरह की विशेषता वस्तु में एक भेजें बाधा जोड़ सकते हैं:

let foo = box Foo { foo: 1 } as Box<Bar + Send>; 

let (tx, rx): (Sender<Box<Bar + Send>>, Receiver<Box<Bar + Send>>) = channel(); 
+2

ओह, हुह, यह काफी आसान है। मुझे लगता है कि मुझे समझ में नहीं आया कि वास्तव में गुण वस्तुओं को कैसे संभाला गया था। तो यह ऐसी विशेषता नहीं है जिसकी एक दयालु वस्तु है, यह अंतर्निहित वस्तु है, है ना? तो आपको बस कंपाइलर को यह बताना होगा कि बॉक्स विशेषता के साथ कुछ पकड़ रहा है, जो 'Send' को पूरा करने के लिए भी होता है। मुझे लगता है मैं अब समझ गया। – guff