aggiornato per Rust 1.x
si può fare qualcosa di simile:
Per prima cosa, prendiamo un blocco dello stdin che consente di lavorare con stdin come lettore bufferizzato (per impostazione predefinita, stdin in Rust è unbuffered; è necessario chiamare il metodo lock()
per ottenere una versione bufferizzata di esso, ma questa versione bufferizzata è solo uno per tutti i thread nel programma, quindi l'accesso ad esso deve essere sincronizzato).
Successivamente, leggiamo la riga successiva (1); Sto usando l'iteratore lines()
il cui metodo next()
restituisce Option<io::Result<String>>
, quindi per ottenere solo String
è necessario unwrap()
due volte.
Quindi lo dividiamo per spazi e tagliamo i pezzi risultanti da spazi bianchi extra (2), rimuoviamo i pezzi vuoti rimasti dopo il ritaglio (3), convertiamo le stringhe in i32
s (4) e raccogliamo il risultato in un vettore (5).
Abbiamo anche bisogno di importare std::io::BufRead
tratto (a) per utilizzare il metodo lines()
.
Se si conosce in anticipo che il vostro ingresso non conterrà più di uno spazio tra i numeri, è possibile omettere il passo (3) e spostare trim()
chiamata da (2) a (1):
let numbers: Vec<i32> =
reader.lock()
.lines().next().unwrap().unwrap()
.trim().split(' ')
.map(|s| s.parse().unwrap())
.collect();
Aggiorna
ruggine, però, già fornisce un metodo per dividere una stringa in una sequenza di parole separati da spazi bianchi, chiamato split_whitespace()
:
let numbers: Vec<i32> =
reader.read_line().unwrap().as_slice()
.split_whitespace()
.map(|s| s.parse().unwrap())
.collect()
split_whitespace()
è in realtà solo una combinazione di split()
e filter()
, proprio come nel mio esempio originale. Usa una funzione nell'argomento split()
che controlla i diversi tipi di spazi bianchi, non solo i caratteri di spazio. È possibile trovare la sua fonte è here.
Grazie Vladimir, hai salvato la giornata. Una nota a parte, wow, Rust è davvero intenso! –
Esiste anche un modo per utilizzare le espressioni regolari per dividere per spazi vuoti arbitrari. Probabilmente darebbe il codice terser, ma richiede l'utilizzo di casse non standard (sebbene sia incluso nella distribuzione). L'esempio [qui] (http://doc.rust-lang.org/regex/enum.Regex.html#method.split) è quasi quello che vuoi. –
Puoi anche usare ['.words()'] (http://doc.rust-lang.org/nightly/std/str/trait.UnicodeStrSlice.html#tymethod.words) (leggermente più generale dei semplici spazi , anche se). – huon