2015-02-15 21 views
8

Nie jest prosta instrukcja po otrzymaniu ciąg jako zmienną w std::io documentation, ale pomyślałem, to powinno działać:Jak odczytać pojedynczy ciąg ze standardowego wejścia?

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

Ale ja dostaję ten błąd:

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

Dlaczego?

Używam nocnego Rust v1.0.

+0

Czytaliście [punkt rdza książki na standardowe wejście] (http://doc.rust-lang.org/book/standard-input.html)? – Shepmaster

+0

@Shepmaster Tak, ale pomyślałem, że "old_io" oznacza, że ​​jest to wycofana funkcja. Czy jest na odwrót? –

+1

Dokumentacja, do której się odnosisz, dotyczy pierwszego wydania alfa. Moduł o nazwie "io" został przemianowany na 'old_io' * po * tym wydaniu, i rzeczywiście jest na drodze wyjścia, ale nie został jeszcze całkowicie wyparty przez nowy moduł' io'. Najpierw musisz ustalić, gdzie stoisz: czy używasz wersji 1.0.0-alfa czy śledzisz nocne kluby? – delnan

Odpowiedz

17

Oto kod trzeba zrobić, co chce (bez komentarzy na temat czy jest to dobry sposób, aby przejść o nim:

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"); 
} 

Jeśli chcesz mieć większą kontrolę nad tym, gdzie linia jest czytać, można użyć Stdin::read_line to akceptuje &mut String dołączyć do Dzięki temu możesz mieć pewność, że ciąg ma wystarczająco duży bufor, lub dołączyć do istniejącego wyrażenie:..

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

w przykładzie 'read_line()', czy nie byłoby bardziej odpowiednie użycie wzorca '.ok(). Expect()' dla zwracanej wartości? Nic nie robisz z wartością 'unwrap()'. – WDRust

+0

@tilde Nie wiem o * bardziej * stosowne, ale nie sądzę, że byłoby to * mniej * odpowiednie. Kiedy "odwijasz" "wynik", wartość błędu zostanie wykorzystana jako wiadomość paniki. Na twoim przykładzie musisz podać komunikat o błędzie dla "oczekiwać", który może być bardziej odpowiedni dla twojego przypadku użycia. – Shepmaster

+0

Nie pomyślałem o tym, że wartość błędu zostanie w każdym razie przesłana do paniki, dzięki za wyjaśnienie! – WDRust

Powiązane problemy