Ich möchte ein Merkmal für Verschlüsse eines bestimmten Typs implementieren. Hier ist ein minimales Beispiel (playground):Das Implementieren eines Merkmals für Verschlüsse führt zu einem Konflikt zwischen gebundener und konkreter Lebensdauer.
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
}
Es ist in diesem Fehler führt:
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`
Ich habe bereits versucht, um explizit die HRTB auf die where
Klausel wie folgt hinzu:
where F: for<'a> Fn(&'a u32)
Aber es hat nicht geholfen. Ich erklärte auch die Lebensdauer auf dem impl
Block stattdessen wie folgt aus:
impl<'a, F> Foo for F
where F: Fn(&'a u32) { ... }
Aber dies führt zu einer Lebensdauer Fehler innerhalb des impl
Block. I denke,, dass diese Fehler richtig sind und der Lebensdauerparameter nicht auf dem impl
Block deklariert werden kann.
Wie kann ich dieses Beispiel beheben?
Hmm, also warum kann der Compiler das nicht ableiten? –
@ChrisEmerson Das interessiert mich auch! Deine und Shepmaster's Antwort hat mir schon geholfen! Das Hinzufügen des expliziten Typs ist in meinem Fall nicht schlecht und funktioniert jetzt. Es ist wirklich schwierig zu entscheiden, welche Antwort zu akzeptieren ist: <... Vielleicht die, die erklären kann, warum die Typinferenz fehlschlägt^_ ^ –