Warum kann ich ein Primitiv nicht aus einem Enum leihen?

8

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:

%Vor%

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?

    
ljedrz 20.05.2017, 18:37
quelle

2 Antworten

7

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.

    
eddyb 21.05.2017, 14:06
quelle
7

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 Typ usize , der nicht lange genug lebt.

    
red75prime 20.05.2017 19:47
quelle

Tags und Links