Dari dokumentasinya , tidak jelas. Di Java Anda bisa menggunakan split
metode seperti ini:
"some string 123 ffd".split("123");
Dari dokumentasinya , tidak jelas. Di Java Anda bisa menggunakan split
metode seperti ini:
"some string 123 ffd".split("123");
Split
dan mengaturnya ke dalam array. Tentu saja ini berarti jumlah item di setiap pemisahan harus sama karena array berukuran tetap dan Anda harus memiliki array yang ditentukan sebelumnya. Saya membayangkan ini mungkin lebih merepotkan daripada hanya membuat fileVec
.Jawaban:
Menggunakan
split()
let mut split = "some string 123 ffd".split("123");
Ini memberikan iterator, yang dapat Anda ulangi, atau
collect()
menjadi vektor.for s in split { println!("{}", s) } let vec = split.collect::<Vec<&str>>(); // OR let vec: Vec<&str> = split.collect();
sumber
.collect::<Vec<_>>()
.let split
?split.len()
tidak ada..count()
.len()
hanya untuk iterator yang mengetahui ukuran pastinya tanpa perlu dikonsumsi,count()
menggunakan iterator.error: cannot borrow immutable local variable
split` sebagai bisa berubah`let mut split
, maaf.Ada tiga cara sederhana:
Dengan pemisah :
s.split("separator") | s.split('/') | s.split(char::is_numeric)
Menurut spasi :
Dengan baris baru :
Hasil dari setiap jenis adalah iterator:
let text = "foo\r\nbar\n\nbaz\n"; let mut lines = text.lines(); assert_eq!(Some("foo"), lines.next()); assert_eq!(Some("bar"), lines.next()); assert_eq!(Some(""), lines.next()); assert_eq!(Some("baz"), lines.next()); assert_eq!(None, lines.next());
sumber
Ada metode khusus
split
untuk structString
:fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>
Pisahkan menurut karakter:
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect(); assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
Pisahkan dengan string:
let v: Vec<&str> = "lion::tiger::leopard".split("::").collect(); assert_eq!(v, ["lion", "tiger", "leopard"]);
Pisahkan dengan penutupan:
let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect(); assert_eq!(v, ["abc", "def", "ghi"]);
sumber
split
mengembalikan sebuahIterator
, yang Anda dapat mengkonversi menjadiVec
menggunakancollect
:split_line.collect::<Vec<_>>()
. Menggunakan iterator alih-alih mengembalikanVec
langsung memiliki beberapa keuntungan:split
malas. Ini berarti bahwa itu tidak akan benar-benar memisahkan garis sampai Anda membutuhkannya. Dengan cara itu tidak akan membuang-buang waktu membelah seluruh string jika Anda hanya perlu beberapa nilai pertama:split_line.take(2).collect::<Vec<_>>()
, atau bahkan jika Anda hanya perlu nilai pertama yang dapat dikonversi ke integer:split_line.filter_map(|x| x.parse::<i32>().ok()).next()
. Contoh terakhir ini tidak akan membuang waktu untuk mencoba memproses "23.0" tetapi akan segera berhenti memproses setelah menemukan "1".split
tidak membuat asumsi tentang cara Anda ingin menyimpan hasilnya. Anda dapat menggunakan aVec
, tetapi Anda juga dapat menggunakan apa pun yang mengimplementasikanFromIterator<&str>
, misalnya aLinkedList
atau aVecDeque
, atau jenis kustom apa pun yang diimplementasikanFromIterator<&str>
.sumber
let x = line.unwrap().split(",").collect::<Vec<_>>();
tidak berfungsi kecuali dipisahkan menjadi dua baris terpisah:let x = line.unwrap();
danlet x = x.split(",").collect::<Vec<_>>();
? Pesan kesalahan mengatakan:temporary value created here ^ temporary value dropped here while still borrowed
let x = line.as_ref().unwrap().split(",").collect::<Vec<_>>();
Ada juga
split_whitespace()
fn main() { let words: Vec<&str> = " foo bar\t\nbaz ".split_whitespace().collect(); println!("{:?}", words); // ["foo", "bar", "baz"] }
sumber