मैं एक विशिष्ट प्रकार के बंद होने के लिए एक विशेषता को लागू करना चाहता हूं। यहाँ एक न्यूनतम उदाहरण (playground) है:बंद होने के लिए एक विशेषता को कार्यान्वित करने के परिणामस्वरूप बाध्य/ठोस जीवनकाल में विसंगति
trait Foo {
fn foo(&self, x: &u32);
}
impl<F> Foo for F
where F: Fn(&u32)
{
fn foo(&self, x: &u32) {
self(x)
}
}
fn main() {
let _: &FnOnce(&u32) = &|x| {}; // works
let _: &Foo = &|x| {}; // doesn't work
}
यह इस त्रुटि में परिणाम है:
error: type mismatch resolving `for<'r> <[[email protected]<anon>:16:29: 16:35] as std::ops::FnOnce<(&'r u32,)>>::Output ==()`:
expected bound lifetime parameter ,
found concrete lifetime [--explain E0271]
--> <anon>:16:28
|>
16 |> let _: &Foo = &|x| {};
|> ^^^^^^^
note: required because of the requirements on the impl of `Foo` for `[[email protected]<anon>:16:29: 16:35]`
note: required for the cast to the object type `Foo`
error: type mismatch: the type `[[email protected]<anon>:16:29: 16:35]` implements the trait `std::ops::Fn<(_,)>`, but the trait `for<'r> std::ops::Fn<(&'r u32,)>` is required (expected concrete lifetime, found bound lifetime parameter) [--explain E0281]
--> <anon>:16:28
|>
16 |> let _: &Foo = &|x| {};
|> ^^^^^^^
note: required because of the requirements on the impl of `Foo` for `[[email protected]<anon>:16:29: 16:35]`
note: required for the cast to the object type `Foo`
मैं पहले से ही स्पष्ट रूप से where
खंड इस तरह के HRTB जोड़ने की कोशिश की:
where F: for<'a> Fn(&'a u32)
लेकिन इससे मदद नहीं मिली। मैं भी impl
खंड पर जीवन भर के बजाय, इस तरह की घोषणा की:
impl<'a, F> Foo for F
where F: Fn(&'a u32) { ... }
लेकिन इस impl
ब्लॉक के भीतर एक जीवन भर त्रुटि का परिणाम है। I सोचें कि ये त्रुटियां सही हैं और impl
ब्लॉक पर आजीवन पैरामीटर घोषित नहीं किया जा सकता है।
मैं इस उदाहरण को कैसे ठीक कर सकता हूं?
हम्म, तो संकलक इसका अनुमान क्यों नहीं लगा सकता? –
@ChrisEmerson मुझे इसमें भी रूचि है! आपके और शेमपस्टर के जवाब ने पहले ही मेरी मदद की है! मेरे मामले में स्पष्ट प्रकार जोड़ना बहुत बुरा नहीं है और यह अब काम करता है। यह तय करना वास्तव में मुश्किल है कि कौन सा जवाब स्वीकार करना है: <... शायद वह जो समझा सकता है कि टाइप अनुमान क्यों विफल रहता है^_ ^ –