Ich möchte in der Lage sein, Verweise (sowohl unveränderlich als auch veränderbar) auf das usize
zu erhalten, das in Bar
in Foo
enum eingepackt ist:
Aber ich kann die veränderbare Referenz nicht erhalten, weil:
n
lebt nicht lange genug
Ich war in der Lage, beide Varianten ähnlicher Funktionen für den Zugriff auf andere Inhalte von Foo
, die Box
ed sind, zur Verfügung zu stellen - warum schlägt das veränderbare Borgen (und warum nur es) mit einem ungepackten Grundelement fehl?
Diese Beispiele zeigen das Beispielproblem:
%Vor% Die explicit_
-Versionen zeigen, was der Compiler durch Deref-Nötigungen ableitet
Die _bad
Versionen beide Fehler auf genau die gleiche Weise, während die anderen beiden kompilieren.
Dies ist entweder ein Fehler oder eine Einschränkung bei der Implementierung von Lebensdauern im Compiler. Die Invarianz von &mut T
über T
könnte etwas damit zu tun haben, weil &mut &'a mut T
invariant gegenüber 'a
und somit restriktiver ist Inferenz als die gemeinsame Referenz ( &&'a T
) Fall, obwohl in dieser Situation die Strenge ist unnötig.
Sie müssen Bar(ref mut n) => &mut n
durch Bar(ref mut n) => n
ersetzen.
Wenn Sie ref mut n
in Bar(ref mut n)
verwenden, wird ein veränderbares Objekt erstellt
Verweis auf die Daten in Bar
, also ist der Typ von n
&mut usize
.
Dann versuchen Sie, &mut n
of &mut &mut u32
type zurückzugeben.
Dieser Teil ist höchstwahrscheinlich nicht korrekt.
Nun Deref-Zwang tritt ein und konvertiert
&mut n
in&mut *n
und erstellt einen temporären Wert*n
vom Typusize
, der nicht lange genug lebt.
Tags und Links enums rust borrow-checker