Ich versuche, einen Container für Objekte des Typs T
zu schreiben, die Zugriff auf Referenzen &T
zu den gespeicherten Objekten bietet (ich möchte vermeiden, Kopien zu erstellen). Da der Behälter nur während seiner Lebensdauer wächst, sollte die Lebensdauer der zurückgegebenen Referenzen &T
die gleiche wie für den Container sein.Gibt es eine idiomatische Möglichkeit, Referenzen auf Elemente eines ständig wachsenden Containers zu halten?
Der nächste, den ich bis jetzt bekommen habe, war, intern Box<T>
Objekte in meinem Container zu verwenden und Box<T>.as_ref()
zu verwenden, um Verweise auf diese Objekte zurückzugeben. Dann aber ich laufe in das gleiche Problem wie in diesem minimal Beispiel:
fn main() {
let mut v = vec![Box::new(1)]; // line 1
let x = v[0].as_ref(); // line 2: immutable borrow occurs here
println!("x = {:?}", x); // line 3
v.push(Box::new(2)); // line 4: mutable borrow occurs here -> error
println!("x = {:?}", x); // line 5
}
Ich verstehe, dass es unvernünftig wäre x
in Zeile 5 zu verwenden, wenn es von v
während der der wandelbaren borrow gelöscht worden war. Aber das ist hier nicht der Fall, und es wird nie für meinen Container sein. Wenn es keinen sicheren Weg gibt, dies in Rust auszudrücken, wie könnte ich das Beispiel "reparieren" (ohne zu kopieren x
)?
ich die Verweise auf die Elemente des Vec entkräften mögliche Umverteilung bewusst bin. Deshalb habe ich Vec verwendet>: die Verweise auf die Box sind instabil, aber die Hinweise auf die T sind stabil, nicht wahr? Immerhin benötigt Vec > Box nicht, um klonbar zu sein, so dass es die Referenzen auf das T nicht ungültig machen kann. –
chs
An diesem Punkt, was Sie wirklich wollen, ist 'Rc', denn das ist buchstäblich die Definition einer gemeinsamen Besitz Referenz in Rust –
Die Vec ist der (einzige) Besitzer des Zeigers, so Referenzzählung ist nicht das, was ich will . Es ist vollkommen in Ordnung, wenn die Referenzen ungültig werden, sobald die Lebensdauer des besitzenden Vec endet. (Ich stimme zu, dass das Referenzzählen das gesamte Besitzproblem vermeiden würde. Aber ich möchte, dass die Referenzen aus Leistungsgründen so leicht wie möglich sind.) – chs