Aus der Dokumentation geht nicht hervor. In Java können Sie die split
Methode folgendermaßen verwenden:
"some string 123 ffd".split("123");
Aus der Dokumentation geht nicht hervor. In Java können Sie die split
Methode folgendermaßen verwenden:
"some string 123 ffd".split("123");
Split
und es in das Array setzen. Dies bedeutet natürlich, dass die Anzahl der Elemente in jedem Split gleich sein muss, da Arrays eine feste Größe haben und das Array zuvor definiert werden muss. Ich stelle mir vor, dass dies mehr Probleme bereiten kann, als nur eine zu erstellenVec
.Antworten:
Verwenden
split()
Dies ergibt einen Iterator, über den Sie eine Schleife oder
collect()
einen Vektor erstellen können.quelle
.collect::<Vec<_>>()
.let split
?split.len()
existiert nicht..count()
.len()
ist nur für Iteratoren, die ihre genaue Größe kennen, ohne verbraucht werden zu müssen,count()
verbraucht den Iterator.error: cannot borrow immutable local variable
split` as veränderlich`let mut split
, sorry.Es gibt drei einfache Möglichkeiten:
Durch Trennzeichen :
Mit Leerzeichen :
Durch Zeilenumbrüche :
Das Ergebnis jeder Art ist ein Iterator:
quelle
Es gibt eine spezielle Methode
split
für structString
:Aufgeteilt nach Zeichen:
Geteilt nach Zeichenfolge:
Durch Verschluss geteilt:
quelle
split
gibt ein zurückIterator
, das Sie in einVec
using konvertieren könnencollect
:split_line.collect::<Vec<_>>()
. Das Durchlaufen eines Iterators anstelle derVec
direkten Rückgabe eines hat mehrere Vorteile:split
ist faul. Dies bedeutet, dass die Linie erst dann wirklich geteilt wird, wenn Sie sie benötigen. Auf diese Weise wird keine Zeit damit verschwendet, die gesamte Zeichenfolge aufzuteilen, wenn Sie nur die ersten Werte benötigen:split_line.take(2).collect::<Vec<_>>()
oder wenn Sie nur den ersten Wert benötigen, der in eine Ganzzahl konvertiert werden kann :split_line.filter_map(|x| x.parse::<i32>().ok()).next()
. Dieses letzte Beispiel verschwendet keine Zeit mit dem Versuch, die "23.0" zu verarbeiten, sondern beendet die Verarbeitung sofort, sobald die "1" gefunden wird.split
macht keine Annahme darüber, wie Sie das Ergebnis speichern möchten. Sie können a verwendenVec
, aber Sie können auch alles verwenden, was implementiert wirdFromIterator<&str>
, z. B. aLinkedList
oder aVecDeque
, oder einen beliebigen benutzerdefinierten Typ, der implementiert wirdFromIterator<&str>
.quelle
let x = line.unwrap().split(",").collect::<Vec<_>>();
funktioniert das nicht, wenn es nicht in zwei separate Zeilen unterteilt ist:let x = line.unwrap();
undlet x = x.split(",").collect::<Vec<_>>();
? Die Fehlermeldung sagt:temporary value created here ^ temporary value dropped here while still borrowed
let x = line.as_ref().unwrap().split(",").collect::<Vec<_>>();
Es gibt auch
split_whitespace()
quelle