Không, không phải; tuy nhiên, bạn có thể dễ dàng lọc trước khi bạn thu thập, trong thực tế có được hiệu quả tương tự.
Nếu bạn muốn lọc theo chỉ mục, bạn cần phải thêm chỉ mục trong và sau đó dải nó sau đó:
enumerate
(để thêm các chỉ số để các phần tử)
filter
dựa trên chỉ số này
map
dải chỉ số từ các yếu tố
Hoặc trong mã:
01.
fn main() {
let line = "Some line of text for example";
let l = line.split(" ")
.enumerate()
.filter(|&(i, _)| i == 3)
.map(|(_, e)| e);
let lvec: Vec<&str> = l.collect();
let text = &lvec[0];
println!("{}", text);
}
Nếu bạn chỉ muốn có một chỉ mục duy nhất (và do đó phần tử), thì việc sử dụng nth
sẽ dễ dàng hơn nhiều. Nó trả về một Option<&str>
đây, mà bạn cần phải chăm sóc:
fn main() {
let line = "Some line of text for example";
let text = line.split(" ").nth(3).unwrap();
println!("{}", text);
}
Nếu bạn có thể có một vị tùy ý nhưng muốn chỉ là yếu tố đầu tiên phù hợp, sau đó thu thập vào một Vec
là không hiệu quả: nó sẽ tiêu thụ toàn bộ iterator (không lười biếng) và phân bổ tiềm năng rất nhiều bộ nhớ mà không cần thiết ở tất cả.
Bạn đang như vậy, tốt hơn hết chỉ đơn giản yêu cầu các yếu tố đầu tiên sử dụng phương pháp next
của iterator, mà trả về một Option<&str>
đây:
fn main() {
let line = "Some line of text for example";
let text = line.split(" ")
.enumerate()
.filter(|&(i, _)| i % 7 == 3)
.map(|(_, e)| e)
.next()
.unwrap();
println!("{}", text);
}
Nếu bạn muốn chọn phần của kết quả, bởi chỉ số , bạn cũng có thể sử dụng skip
và take
trước khi thu thập, nhưng tôi đoán bạn có đủ lựa chọn thay thế được trình bày ở đây rồi.
Cảm ơn bạn, rất nhiều để có ở đây nhưng rất hữu ích. Bạn đã đề cập rằng việc thu thập vào một Vec là không hiệu quả. Bạn có thể nhận xét về tốc độ thực hiện line.split.enumerate.filter.map.unwrap nhiều lần để lấy các mục khác nhau từ chuỗi so với thu thập toàn bộ đồ vật vào một Vec và sau đó sử dụng chỉ mục vector để truy xuất các mục. Ví dụ như một quy tắc nhỏ, nếu cần truy cập 1/4 mục, tôi sẽ làm phương pháp nào? – kezzos
@kezzos: Tôi đã đề cập rằng việc thu thập * mọi thứ * vào một véc tơ không hiệu quả, và tôi cũng đưa ra lý do: lặp lại cho đến khi bạn không quan tâm đến những phần cuối cùng và phân bổ bộ nhớ. Nếu bạn cần phải thu thập 1/4 của các mảnh, sau đó tôi sẽ không lo lắng về việc cấp phát bộ nhớ, tuy nhiên bạn vẫn có thể đạt được từ cắt ngắn lặp (sử dụng 'take'). –
Ngoài ra còn có ['filter_map'] (http://doc.rust-lang.org/std/iter/trait.Iterator.html#method.filter_map) để kết hợp các bước' filter' và 'map'. – Shepmaster