Zum Inhalt springen

Eigentümerschaft

Betrachten Sie die Berechtigungen im folgenden Programm:

#fn main() {
let mut s = String::from("Hello");
let t = &mut s;
/* here */
t.push_str(" world");
println!("{}", s);
#}

An der mit /* here */ markierten Stelle, welche Berechtigungen hat der Pfad s? Wählen Sie jede Berechtigung unten aus, oder wählen Sie “Keine Berechtigungen”, wenn der Pfad keine Berechtigungen hat.

Das mutable Borrowing t = &mut s entzieht alle Berechtigungen für s, solange t aktiv ist.


Betrachten Sie die Berechtigungen im folgenden Programm:

fn get_first(v: &Vec<String>) -> &String {
&v[0]
}
fn main() {
let mut strs = vec![
String::from("A"), String::from("B")
];
let first = get_first(&strs);
if first.len() > 0 {
strs.push(String::from("C"));
}
}

Welche der folgenden Aussagen erklärt am besten, warum strs Schreibberechtigungen verliert und wiedererlangt?

Wenn get_first aufgerufen wird, erkennt Rust, dass der zurückgegebene String first auf Daten innerhalb von strs zeigen könnte, daher verliert strs Schreibberechtigungen. Sobald die Variable first nicht mehr verwendet wird (nach der If-Bedingung), erlangt strs die Schreibberechtigungen wieder.


Betrachten Sie dieses unsichere Programm:

#fn main() {
let v1 = vec![1, 2, 3];
let mut v2 = v1;
v2.push(4);
println!("{}", v1[0]);
#}

Welche der folgenden Aussagen beschreibt am besten den Zeitpunkt, an dem in diesem Programm undefiniertes Verhalten auftritt?

Das undefinierte Verhalten entsteht, weil v1 gelesen wird, nachdem es freigegeben wurde. Beachten Sie, dass die anderen drei Optionen korrekte Aussagen über das Programm sind, aber sie erklären nicht, warum das undefinierte Verhalten tatsächlich auftritt. Wenn zum Beispiel das println gelöscht würde, wären die anderen drei Optionen immer noch wahr, aber das Programm hätte kein undefiniertes Verhalten mehr.