2015-02-15 8 views
8

Non c'è l'istruzione diretta su ricezione di una stringa come una variabile nel std::io documentation, ma ho pensato che questo dovrebbe funzionare:Come si legge una singola stringa dall'input standard?

use std::io; 
let line = io::stdin().lock().lines().unwrap(); 

ma sto ottenendo questo errore:

src\main.rs:28:14: 28:23 error: unresolved name `io::stdin` 
src\main.rs:28   let line = io::stdin.lock().lines().unwrap(); 
            ^~~~~~~~~ 

Perché?

Sto usando un nightly Rust v1.0.

+0

hai letto [sezione di The Rust Prenota input standard] (http://doc.rust-lang.org/book/standard-input.html)? – Shepmaster

+0

@Shepmaster Sì, ma ho capito che "old_io" significa che si tratta di una funzionalità deprecata. È il contrario? –

+1

La documentazione a cui si fa riferimento è per la prima versione alfa. Il modulo allora chiamato 'io' è stato rinominato' old_io' * dopo * quella release, ed è effettivamente in uscita, ma non è ancora completamente sostituito dal nuovo modulo 'io'. Per prima cosa devi capire dove ti trovi: stai usando 1.0.0-alpha o stai seguendo le nottate? – delnan

risposta

17

Ecco il codice che devi fare quello che si sta cercando (nessun commento su se è un buon modo per andare a questo proposito:

use std::io::{self, BufRead}; 

fn main() { 
    let stdin = io::stdin(); 
    let line = stdin.lock() 
     .lines() 
     .next() 
     .expect("there was no next line") 
     .expect("the line could not be read"); 
} 

Se si desidera un maggiore controllo sul dove la linea viene letta a, è possibile utilizzare Stdin::read_line questo accetta un &mut String da aggiungere al Con questo, è possibile garantire che la stringa ha un buffer di grandi dimensioni abbastanza, o aggiungere ad una stringa esistente:..

use std::io::{self, BufRead}; 

fn main() { 
    let mut line = String::new(); 
    let stdin = io::stdin(); 
    stdin.lock().read_line(&mut line).expect("Could not read line"); 
    println!("{}", line) 
} 
+0

nell'esempio 'read_line()', non sarebbe più appropriato usare '.ok(). Expect()' pattern per il valore restituito? Non stai facendo nulla con il valore di 'unwrap()' ped. – WDRust

+0

@tilde Non so * più * appropriato, ma non penso che sarebbe * meno * appropriato. Quando si "scartala" a 'Risultato', il valore di errore verrà usato come messaggio di panico. Con il tuo esempio, dovresti fornire un messaggio di errore per "expect", che potrebbe essere più appropriato per il tuo caso d'uso. – Shepmaster

+0

Non ho pensato al fatto che il valore dell'errore si sarebbe propagato al panico comunque, grazie per il chiarimento! – WDRust

Problemi correlati