@bow Czy istnieje sposób, aby uczynić z niej tablicę String zamiast wektora?
Greg
Nie znam żadnego sposobu, żeby to zrobić, przynajmniej bezpośrednio. Prawdopodobnie musiałbyś ręcznie wykonać iterację Spliti ustawić go w tablicy. Oczywiście oznacza to, że liczba elementów w każdym podziale musi być taka sama, ponieważ tablice mają stały rozmiar i musisz mieć wcześniej zdefiniowaną tablicę. Wyobrażam sobie, że może to być większy problem niż zwykłe utworzenie pliku Vec.
jak uzyskać długość wyniku - let split? split.len()nie istnieje.
ア レ ッ ク ス
5
@AlexanderSupertramp Use .count(). len()jest tylko dla iteratorów, które znają swój dokładny rozmiar bez konieczności używania, count()zużywa iterator.
Manishearth
error: cannot borrow immutable local variable split` as mutable`
splitZwraca Iterator, które można przekonwertować na Vecużyciu collect: split_line.collect::<Vec<_>>(). Przechodzenie przez iterator zamiast zwracania Vecbezpośrednio ma kilka zalet:
splitjest leniwy. Oznacza to, że tak naprawdę nie podzieli linii, dopóki jej nie potrzebujesz. W ten sposób nie będzie tracić czasu podział cały ciąg jeśli potrzebujesz tylko kilka pierwszych wartości: split_line.take(2).collect::<Vec<_>>()albo nawet, jeśli potrzebujesz tylko pierwszą wartość, która może być zamienione na liczbę całkowitą: split_line.filter_map(|x| x.parse::<i32>().ok()).next(). Ten ostatni przykład nie marnuje czasu na próby przetworzenia „23.0”, ale przerwie przetwarzanie natychmiast po znalezieniu „1”.
splitnie przyjmuje żadnych założeń co do sposobu, w jaki chcesz zapisać wynik. Możesz użyć a Vec, ale możesz także użyć wszystkiego, co implementuje FromIterator<&str>, na przykład a LinkedListlub a VecDeque, lub dowolnego typu niestandardowego, który implementuje FromIterator<&str>.
Dziękuję za szczegółową odpowiedź, wszelkie pomysły dlaczego let x = line.unwrap().split(",").collect::<Vec<_>>();nie działają, chyba że są podzielone na dwie osobne linie: let x = line.unwrap();i let x = x.split(",").collect::<Vec<_>>();? Komunikat o błędzie brzmi:temporary value created here ^ temporary value dropped here while still borrowed
Greg
Jednak działa zgodnie z oczekiwaniami, jeśli używam let x = line.as_ref().unwrap().split(",").collect::<Vec<_>>();
Split
i ustawić go w tablicy. Oczywiście oznacza to, że liczba elementów w każdym podziale musi być taka sama, ponieważ tablice mają stały rozmiar i musisz mieć wcześniej zdefiniowaną tablicę. Wyobrażam sobie, że może to być większy problem niż zwykłe utworzenie plikuVec
.Odpowiedzi:
Posługiwać się
split()
Daje to iterator, który można zapętlić lub
collect()
do wektora.źródło
.collect::<Vec<_>>()
.let split
?split.len()
nie istnieje..count()
.len()
jest tylko dla iteratorów, które znają swój dokładny rozmiar bez konieczności używania,count()
zużywa iterator.error: cannot borrow immutable local variable
split` as mutable`let mut split
, przepraszam.Istnieją trzy proste sposoby:
Przez separator :
Według białych znaków :
Przez nowych linii :
Wynikiem każdego rodzaju jest iterator:
źródło
Istnieje specjalna metoda
split
dla structString
:Podziel według znaku:
Podziel według łańcucha:
Dzielone przez zamknięcie:
źródło
split
ZwracaIterator
, które można przekonwertować naVec
użyciucollect
:split_line.collect::<Vec<_>>()
. Przechodzenie przez iterator zamiast zwracaniaVec
bezpośrednio ma kilka zalet:split
jest leniwy. Oznacza to, że tak naprawdę nie podzieli linii, dopóki jej nie potrzebujesz. W ten sposób nie będzie tracić czasu podział cały ciąg jeśli potrzebujesz tylko kilka pierwszych wartości:split_line.take(2).collect::<Vec<_>>()
albo nawet, jeśli potrzebujesz tylko pierwszą wartość, która może być zamienione na liczbę całkowitą:split_line.filter_map(|x| x.parse::<i32>().ok()).next()
. Ten ostatni przykład nie marnuje czasu na próby przetworzenia „23.0”, ale przerwie przetwarzanie natychmiast po znalezieniu „1”.split
nie przyjmuje żadnych założeń co do sposobu, w jaki chcesz zapisać wynik. Możesz użyć aVec
, ale możesz także użyć wszystkiego, co implementujeFromIterator<&str>
, na przykład aLinkedList
lub aVecDeque
, lub dowolnego typu niestandardowego, który implementujeFromIterator<&str>
.źródło
let x = line.unwrap().split(",").collect::<Vec<_>>();
nie działają, chyba że są podzielone na dwie osobne linie:let x = line.unwrap();
ilet x = x.split(",").collect::<Vec<_>>();
? Komunikat o błędzie brzmi:temporary value created here ^ temporary value dropped here while still borrowed
let x = line.as_ref().unwrap().split(",").collect::<Vec<_>>();
Jest także
split_whitespace()
źródło