Ich habe Option<&mut T>
und möchte mehrmals auf die enthaltene Referenz zugreifen:
Das funktioniert nicht, weil if let Some(x) = a
den Referenzwert aus der Option entfernt und der zweite if let Some(x) = a
einen Compilerfehler zur Folge hat. Ohne das zweite if let ...
funktioniert das einwandfrei, also muss a
nicht veränderbar sein.
Folgendes:
%Vor%gibt einen Fehler: "Zuweisung in eine unveränderliche Referenz".
Das würde funktionieren:
%Vor% Das mut a
ist notwendig, sonst bekomme ich einen Fehler "kann das unveränderliche anonyme Feld (a:std::prelude::v1::Some).0
als veränderbar nicht ausleihen". Aber das fühlt sich falsch an: a
sollte nicht veränderbar sein, weil ich es nicht modifiziere (siehe oben).
Was ist die richtige Lösung?
Mein Problem unterscheidet sich von dem in Wie man 'Option & lt; & amp; mut ... & gt;' zu mehreren Funktionsaufrufen, ohne Bewegungsfehler zu verursachen? . Ich möchte den Verweis mehrmals in Option<&mut T>
dereferenzieren, während der andere einen Option
an mehrere Funktionsaufrufe übergeben möchte. Die Lösungen für die andere Frage sind nicht auf meine Situation anwendbar.
Was ist damit?
%Vor% In diesem Fall muss a
nicht änderbar sein.
Das &mut ref mut
fühlt sich ein wenig peinlich an, aber es macht Sinn: Zuerst entfernen wir eine &mut
durch Destrukturierung und nehmen dann wieder eine veränderbare Referenz auf den Wert. Es ist offensichtlicher, wenn wir Option
nicht verwenden:
Das funktioniert auch. Die dritte (spezielle) Zeile entspricht:
%Vor% Im Fall Option
können wir nicht die &mut *X
-Version verwenden, sondern müssen alles innerhalb des Musters tun. Also die &mut ref mut x
.
Tags und Links rust