Zum Inhalt springen

Vektoren

Welcher Aufruf dieser Funktion find_until führt zu einer Laufzeit-Panik?

fn find_until(v: &Vec<i32>, n: i32, til: usize) -> Option<usize> {
for i in 0 .. til {
if v[i] == n {
return Some(i);
}
}
return None;
}

Wenn til = 4 ist, versucht die for-Schleife bei einem Vektor der Länge 3, den Vektor mit i = 3 zu indizieren, was außerhalb der Grenzen liegt. Diese Funktion gerät nicht in Panik, wenn n = 1 ist, da sie zurückkehrt, bevor der Index außerhalb der Grenzen erreicht wird.


fn main() {
let mut v = Vec::new();
let s = String::from("Hello ");
v.push(s);
v[0].push_str("world");
println!("original: {}", s);
println!("new: {}", v[0]);
}

Vec::push verschiebt sein Argument, daher ist s nach dem Aufruf von v.push(s) nicht mehr verwendbar. Der Aufruf von println!("original: {}", s) ist daher nicht Ownership-sicher.


fn main() {
let v = vec![String::from("Hello ")];
let mut s = v[0];
s.push_str("world");
println!("{s}");
}

Nicht-kopierbare Typen können nicht durch Indexierung aus einem Vektor verschoben werden. Nur Methoden wie Vec::remove erlauben das Verschieben aus einem Vektor. Siehe Abschnitt 4.3 “Kopieren vs. Verschieben aus einer Sammlung” für eine tiefere Erklärung, warum dies so ist.