के साथ संबंधित प्रकार के गुण का उपयोग कर लाइफटाइम त्रुटि मुझे दो प्रकार के समान कार्यक्रमों द्वारा प्रदर्शित किए गए एक संबंधित प्रकार का उपयोग करने के कारण जंग 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
}
मुझे समझ में नहीं आता कि पुनरावृत्ति प्रत्यक्ष तत्कालता से अलग क्यों है।
मैं अभी भी इसे काम करने की कोशिश कर रहा हूं। लेकिन मैं _did_ पाते हैं कि आप 'in_iter()' के बजाय 'iter()' का उपयोग कर सकते हैं और यह काम करेगा। –