No, non lo è; tuttavia è possibile facilmente filtro prima di voi raccogliere, che in pratica raggiunge lo stesso effetto.
Se si desidera filtrare per indice, è necessario aggiungere l'indice e poi spogliarla seguito:
enumerate
(per aggiungere l'indice per l'elemento)
filter
in base a questo indice
map
per spellare l'index dall'elemento
O in codice:
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);
}
Se si desidera ottenere un solo indice (e quindi elemento), utilizzare nth
è molto più semplice. Restituisce un Option<&str>
qui, che è necessario prendersi cura di:
fn main() {
let line = "Some line of text for example";
let text = line.split(" ").nth(3).unwrap();
println!("{}", text);
}
Se è possibile avere un predicato arbitraria, ma vuole solo il primo elemento che corrisponde, quindi raccogliendo in un Vec
è inefficiente: si consumerà l'intero iteratore (senza pigrizia) e allocare potenzialmente molta memoria che non è affatto necessaria.
Si sono quindi meglio semplicemente chiedendo per il primo elemento con il metodo next
del iteratore, che restituisce un Option<&str>
qui:
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);
}
Se si desidera selezionare parte del risultato, in base all'indice , puoi anche usare skip
e take
prima di raccogliere, ma suppongo che tu abbia già abbastanza alternative qui presentate.
Grazie, molto da vedere qui ma molto utile. Hai detto che la raccolta in un Vec è inefficiente. Sareste in grado di commentare la velocità di esecuzione di line.split.enumerate.filter.map.unwrap più volte per afferrare elementi diversi dalla stringa e raccogliere l'intera cosa in un VEC e quindi utilizzare l'indicizzazione vettoriale per recuperare gli elementi. Ad esempio, come regola generale, se è necessario accedere a 1/4 degli articoli, quale metodo devo seguire? – kezzos
@kezzos: Ho detto che la raccolta di * tutto * in un vettore era inefficiente, e ho anche spiegato i motivi: iterando fino alla fine quando non ti interessa gli ultimi pezzi e l'allocazione della memoria. Se hai bisogno di raccogliere 1/4 di pezzi, allora non mi preoccuperei dell'allocazione di memoria, comunque potresti ancora guadagnare tagliando l'iterazione in breve (usando 'take'). –
C'è anche ['filter_map'] (http://doc.rust-lang.org/std/iter/trait.Iterator.html#method.filter_map) per combinare i passi' filter' e 'map'. – Shepmaster