2016-12-26 7 views
7

के साथ संबंधित प्रकार के गुण का उपयोग कर लाइफटाइम त्रुटि मुझे दो प्रकार के समान कार्यक्रमों द्वारा प्रदर्शित किए गए एक संबंधित प्रकार का उपयोग करने के कारण जंग 1.14 के साथ आजीवन त्रुटि मिल रही है, जो पहले त्रुटि के बिना संकलित होता है और दूसरा जिसमें आजीवन त्रुटिलाइफटाइम त्रुटि आजीवन पैरामीटर

कार्यक्रम # 1 - त्रुटि के बिना संकलित

trait Trait<'a> { 
    type T; 
} 

struct Impl; 

impl<'a> Trait<'a> for Impl { 
    type T = std::marker::PhantomData<&'a()>; 
} 

struct Alpha<'a, T: Trait<'a>> { 
    _dummy: std::marker::PhantomData<(&'a(), T)>, 
} 

fn use_alpha<'a>(_: &'a Alpha<'a, Impl>) {} 

fn main() { 
    for x in Vec::<Alpha<Impl>>::new().into_iter() { 
     use_alpha(&x); // <-- ok 
    } 
} 

कार्यक्रम # 2 - जीवन त्रुटि

trait Trait<'a> { 
    type T; 
} 

struct Impl; 

impl<'a> Trait<'a> for Impl { 
    type T = std::marker::PhantomData<&'a()>; 
} 

struct Alpha<'a, T: Trait<'a>> { 
    _dummy: std::marker::PhantomData<(&'a(), T::T)>, 
} 

fn use_alpha<'a>(_: &'a Alpha<'a, Impl>) {} 

fn main() { 
    for x in Vec::<Alpha<Impl>>::new().into_iter() { 
     use_alpha(&x); // <-- !error! 
    } 
} 

यहाँ है दूसरे कार्यक्रम के लिए संकलन समय त्रुटि है:

error: `x` does not live long enough 
    --> src/main.rs:20:5 
    | 
19 |   use_alpha(&x); // <-- !error! 
    |     - borrow occurs here 
20 |  } 
    | ^`x` dropped here while still borrowed 
    | 
    = note: values in a scope are dropped in the opposite order they are created 

यहाँ दो कार्यक्रमों के लिए अंतर है:

#[derive(Clone)] 
struct Alpha<'a, T: Trait<'a>> { 
- _dummy: std::marker::PhantomData<(&'a(), T)>, 
+ _dummy: std::marker::PhantomData<(&'a(), T::T)>, 
} 

फर्क सिर्फ इतना है कि पहले कार्यक्रम के बदलने से कोई जुड़े प्रकार के बजाय struct परिभाषा प्रकार पैरामीटर का उपयोग करने के लिए है, एक जीवन भर त्रुटि तब होती है। मुझे नहीं पता कि ऐसा क्यों होता है। जहां तक ​​मैं कह सकता हूं, संबंधित प्रकार को कोई अतिरिक्त जीवनकाल प्रतिबंध नहीं लगाना चाहिए-यह सब सिर्फ 'a है, लेकिन स्पष्ट रूप से जंग का संकलक असहमत है।

यदि मैं दूसरे प्रोग्राम के main फ़ंक्शन को सरल तत्कालता के साथ प्रतिस्थापित करता हूं, तो आजीवन त्रुटि दूर हो जाती है। यह है:

fn main() { 
    let x = Alpha::<Impl> { _dummy: std::marker::PhantomData }; 
    use_alpha(&x); // <-- ok in both programs 
} 

मुझे समझ में नहीं आता कि पुनरावृत्ति प्रत्यक्ष तत्कालता से अलग क्यों है।

+0

मैं अभी भी इसे काम करने की कोशिश कर रहा हूं। लेकिन मैं _did_ पाते हैं कि आप 'in_iter()' के बजाय 'iter()' का उपयोग कर सकते हैं और यह काम करेगा। –

उत्तर

4

use_alpha में, आपने Alpha और इसके जीवनकाल पैरामीटर के संदर्भ में एक ही जीवनकाल का उपयोग किया है। इसका आजीवन पैरामीटर तब Impl का Trait::T का जीवनकाल बन जाता है। नोट ऑर्डर के बारे में एक संकेत देता है कि मान गिराए गए हैं: Impl::TImpl से पहले गिरा दिया गया है क्योंकि यह Impl की परिभाषा का हिस्सा है, लेकिन इसका मतलब है कि Alpha के कुछ हिस्सों को पहले से ही गिरा दिया गया है।

आप use_alpha में दो जीवन काल पैरामीटर्स का उपयोग करके इसे ठीक कर सकते हैं:

fn use_alpha<'a, 'b>(_: &'a Alpha<'b, Impl>) {} 

इस संकलक प्रकारों में से प्रत्येक के लिए अलग जीवन काल अनुमान लगाने के लिए अनुमति देगा।

+0

पूछे जाने के 4 घंटे बाद, और आपने मुझे मिनटों के जवाब में हरा दिया ... – Shepmaster

+2

@ शेमपस्टर अंत में! : पी –

+0

इसके अलावा, कृपया अपना पोस्ट भी पोस्ट करें या मेरा संपादन करें। मैं अपने स्पष्टीकरण से पूरी तरह खुश नहीं हूं - आंशिक रूप से क्योंकि मुझे यकीन नहीं है कि मैं इसे 100% समझता हूं। –

संबंधित मुद्दे