Zum Inhalt springen

Interne Mutabilität

Welche der folgenden Aussagen beschreibt das Konzept der internen Mutabilität in Rust am besten?

Die Hauptidee der internen Mutabilität besteht darin, einen Wert vom Typ &T zu nehmen und Daten innerhalb von T sicher mutieren zu können.


Betrachten Sie eine API, die die Anzahl der Aufrufe einer bestimmten Methode verfolgt:

struct Api {
count: ???
}
impl Api {
fn some_method(&self) {
// increment count
// rest of the method...
}
}

Angenommen, der Zähler wird als usize dargestellt. Welcher der folgenden Wrapper-Typen wäre für diese Situation am besten geeignet?

Hier ist ein RefCell nützlich, um ein internes Feld zu mutieren, obwohl some_method eine unveränderliche Referenz als Eingabe erhält. Wenn das interne Feld nur eine Ganzzahl ist, wäre eine noch bessere Typwahl Cell<usize> oder AtomicUsize .


Betrachten Sie die folgende inkorrekte Implementierung eines RefCell , die nicht überprüft, ob der interne Wert ausgeliehen ist:

use std::cell::UnsafeCell;
struct BadRefCell<T>(UnsafeCell<T>);
impl<T> BadRefCell<T> {
pub fn borrow_mut(&self) -> &mut T {
unsafe { &mut *self.0.get() }
}
}

Angenommen, wir haben ein BadRefCell wie dieses:

let v = BadRefCell(UnsafeCell::new(vec![1, 2, 3]));

Welcher der folgenden Code-Schnipsel würde die Speichersicherheit unter Verwendung dieser API verletzen?

Das BadRefCell erlaubt uns, zwei veränderliche Referenzen auf die zugrunde liegenden Daten gleichzeitig zu haben, was eine Verletzung der Speichersicherheit ermöglicht, wie z.B. die Neuzuweisung eines Vektors, während eine Referenz auf dessen Inhalt gehalten wird.