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 file Vec
.
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();
.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 :
s.split_whitespace()
Dengan baris baru :
s.lines()
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());
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"]);
split
mengembalikan sebuah Iterator
, yang Anda dapat mengkonversi menjadi Vec
menggunakan collect
: split_line.collect::<Vec<_>>()
. Menggunakan iterator alih-alih mengembalikan Vec
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 a Vec
, tetapi Anda juga dapat menggunakan apa pun yang mengimplementasikan FromIterator<&str>
, misalnya a LinkedList
atau a VecDeque
, atau jenis kustom apa pun yang diimplementasikan FromIterator<&str>
.let x = line.unwrap().split(",").collect::<Vec<_>>();
tidak berfungsi kecuali dipisahkan menjadi dua baris terpisah: let x = line.unwrap();
dan let 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"]
}