Ich habe folgende struct
:Warum benötigt dieses Strukturelement zwei Lebenszeiten?
struct PeekableRead<'a, R: Read> {
reader: &'a mut R,
peeked_octet: Option<u8>,
}
Welche rustc
nicht mag:
…:27:1: 30:2 error: the parameter type `R` may not live long enough [E0309]
…:27 struct PeekableRead<'a, R: Read> {
…:28 reader: &'a mut R,
…:29 peeked_octet: Option<u8>,
…:30 }
…:27:1: 30:2 help: run `rustc --explain E0309` to see a detailed explanation
…:27:1: 30:2 help: consider adding an explicit lifetime bound `R: 'a`...
…:27:1: 30:2 note: ...so that the reference type `&'a mut R` does not outlive the data it points at
…:27 struct PeekableRead<'a, R: Read> {
…:28 reader: &'a mut R,
…:29 peeked_octet: Option<u8>,
…:30 }
Wenn ich hinzufügen, um die Lebensdauer zu R
, wie in, R: Read + 'a
, es funktioniert. Aber warum? Gibt die 'a
auf der Referenz nicht die Lebensdauer an? Muss nicht reader: &'a mut R
, in einer struct PeekableRead<'a>
leben so lange wie die Struktur selbst, und damit "lang genug"?
Seltsamerweise brauche ich beide; Wenn ich 'a
zu R
hinzufüge und es von der Referenz entferne, bekomme ich immer noch error: missing lifetime specifier
. Die einzige Art und Weise, wie ich eine erfolgreiche Kompilierung bekomme, ist bei beiden, aber für mich scheinen sie dasselbe redundant zu spezifizieren.
(Auch, warum tut rustc
Ausgang der struct
zweimal in der Ausgabe? Die zweite sieht aus wie ein Vorschlag, was zu tun ist, aber genau das gleiche zu sein scheint als das, was ich habe ...)
Sie können 'struct PeekableRead <'a, R:' a + Lesen>' die extern sichtbare API für die Struktur betrachten, während die Felder Implementierungsdetails sind. Diese Motivation ist jedoch keine allgemeine Regel, da wir uns einige Eigenschaften der Struktur vorstellen können, die nicht explizit so geschrieben sind (Varianz jedes generischen Parameters und Auto-Traits). – bluss