Można zadzwonić str::parse()
, ale trzeba się upewnić, że read_line
działa. Musimy czytnika:
use std::io;
fn main() {
let reader = io::stdin();
}
stdin
czyta globalny bufor, który obsługuje strumień wejściowy, a także realizuje BufRead
cechę, która ma metodę read_line
method. Wymaga to zmiennego String
jako bufora wejściowego i odczytuje wszystkie bajty ze strumienia aż do osiągnięcia bajtu nowego wiersza i dołącza je do bufora. Metoda #expect()
rozpakowuje Result
; jeśli jest to Err
, będzie panikował z wiadomością i przyczyną.
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
}
Mamy teraz tekst wejściowy, który chcemy przekonwertować na i32
. To jest miejsce, w którym str::parse()
będzie działać dla nas, o ile damy mu typ do parsowania. str::trim()
jest konieczne, ponieważ read_line
zawiera znak nowej linii bajt bufora
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input = input_text.trim().parse::<i32>();
}
Nie jesteśmy jeszcze zrobione, wciąż musimy upewnić się, że udało nam się analizowany wejście przy użyciu dopasowywania wzorców. Cały kod trzeba zamienić oryginalny bufor wejściowy do całkowitej powierzchni użytkowej jest:
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input_opt = input_text.trim().parse::<i32>();
let input_int = match input_opt {
Ok(input_int) => input_int,
Err(e) => {
println!("please input a number ({})", e);
return;
}
};
println!("{}", input_int);
}
To kompiluje bez błędów lub ostrzeżeń.
Ta odpowiedź odnosi się do 'old_io' modułu, które nie są dostępne w Rust 1,0; ta odpowiedź nie jest już użyteczna. – Shepmaster